LOJ10092半连通子图
Description
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意
两点u,v,存在一条u到v的有向路径或者从v到u的有向路径。若G'=(V',E')满足V'?V,E'是E中所有跟V'有关的边,
则称G'是G的一个导出子图。若G'是G的导出子图,且G'半连通,则称G'为G的半连通子图。若G'是G所有半连通子图
中包含节点数最多的,则称G'是G的最大半连通子图。给定一个有向图G,请求出G的最大半连通子图拥有的节点数K
,以及不同的最大半连通子图的数目C。由于C可能比较大,仅要求输出C对X的余数。
Input
第一行包含两个整数N,M,X。N,M分别表示图G的点数与边数,X的意义如上文所述接下来M行,每行两个正整
数a, b,表示一条有向边(a, b)。图中的每个点将编号为1,2,3…N,保证输入中同一个(a,b)不会出现两次。N ≤1
00000, M ≤1000000;对于100%的数据, X ≤10^8
Output
应包含两行,第一行包含一个整数K。第二行包含整数C Mod X.
Sample Input
1 2
2 1
1 3
2 4
5 6
6 4
Sample Output
3
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10,maxm=1e6+10;
4 struct edge
5 {
6 int u,v,nxt;
7 }e[maxm],ee[maxm];
8 int head[maxn],js,headd[maxn],jss;
9 void addage(edge e[],int head[],int &js,int u,int v)
10 {
11 e[++js].u=u;e[js].v=v;
12 e[js].nxt=head[u];head[u]=js;
13 }
14 int dfn[maxn],low[maxn],cnt,st[maxn],top,lt[maxn],lts,ltn[maxn];
15 void tarjan(int u)
16 {
17 dfn[u]=low[u]=++cnt;
18 st[++top]=u;
19 for(int i=head[u];i;i=e[i].nxt)
20 {
21 int v=e[i].v;
22 if(!dfn[v])
23 {
24 tarjan(v);
25 low[u]=min(low[u],low[v]);
26 }
27 else if(!lt[v])
28 low[u]=min(low[u],dfn[v]);
29 }
30 if(dfn[u]==low[u])
31 {
32 lt[u]=++lts;ltn[lts]++;
33 while(st[top]!=u)lt[st[top--]]=lts,ltn[lts]++;
34 --top;
35 }
36 }
37 int n,m,x;
38 int f[maxn],ff[maxn];
39 int cd[maxn],rd[maxn];
40 int maxd,maxf;
41 int pc[maxn];
42 queue<int>q;
43 void dfs()
44 {
45 while(!q.empty())
46 {
47 int u=q.front();q.pop();
48 maxd=max(maxd,f[u]);
49 for(int i=headd[u];i;i=ee[i].nxt)
50 {
51 int v=ee[i].v;
52 rd[v]--;
53 if(rd[v]==0)q.push(v);
54 if(pc[v]==u)continue;
55 if(f[u]+ltn[v]>f[v])
56 {
57 f[v]=f[u]+ltn[v];
58 ff[v]=ff[u];
59
60 }
61 else if(f[u]+ltn[v]==f[v])
62 {
63 ff[v]=(ff[u]+ff[v])%x;
64 }
65 pc[v]=u;
66 }
67 }
68 }
69 int main()
70 {
71 scanf("%d%d%d",&n,&m,&x);
72 for(int u,v,i=1;i<=m;++i)
73 {
74 scanf("%d%d",&u,&v);
75 addage(e,head,js,u,v);
76 }
77 for(int i=1;i<=n;++i)
78 if(!dfn[i])tarjan(i);
79 for(int u=1;u<=n;++u)
80 for(int i=head[u];i;i=e[i].nxt)
81 if(lt[e[i].u]!=lt[e[i].v])addage(ee,headd,jss,lt[e[i].u],lt[e[i].v]),cd[lt[e[i].u]]++,rd[lt[e[i].v]]++;
82 for(int i=1;i<=lts;++i)
83 if(rd[i]==0)q.push(i),f[i]=ltn[i],ff[i]=1;
84 dfs();
85 for(int i=1;i<=lts;++i)
86 {
87 if(f[i]==maxd)maxf=(maxf+ff[i])%x;
88 }
89 printf("%d\n%d\n",maxd,maxf);
90 return 0;
91 }
LOJ10092半连通子图的更多相关文章
- LOJ-10092(最大半连通子图)
题目连通:传送门 思路: 题目定义很清晰,然后就不会了QAQ…… 后来看了书,先缩点,然后再用拓扑排序找到最长的链子的节点数(因为缩点后所有点都是一个强连通分量,所以找最长的链子就是最大限度包含 点的 ...
- 最大半连通子图 bzoj 1093
最大半连通子图 (1.5s 128MB) semi [问题描述] 一个有向图G = (V,E)称为半连通的(Semi-Connected),如果满足:∀ u, v ∈V,满足u->v 或 v - ...
- BZOJ1093 [ZJOI2007]最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- BZOJ1093 最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到 ...
- [BZOJ]1093 最大半连通子图(ZJOI2007)
挺有意思的一道图论. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:∀u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v ...
- BZOJ1093 ZJOI2007最大半连通子图(缩点+dp)
发现所谓半连通子图就是缩点后的一条链之后就是个模板题了.注意缩点后的重边.写了1h+真是没什么救了. #include<iostream> #include<cstdio> # ...
- bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
- 【刷题】BZOJ 1093 [ZJOI2007]最大半连通子图
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到 ...
- BZOJ 1093 最大半连通子图 题解
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 2767 Solved: 1095[Submit][S ...
随机推荐
- Selenium多浏览器测试
在浏览器的兼容性测试中,会测试产品在不同浏览器上的兼容性,比较主流的浏览器有IE.Firefox.Chrome,Opera,Safari等.还有其它如360.QQ.遨游.百度等浏览器都是基于IE或者c ...
- 微信支付(PC扫码支付和H5公众号支付)
最近在做微信支付,微信支付比较坑,官方居然只有.NET.C#.PHP的demo居然没有java的demo.然后微信支付是不提供测试账号的需要直接用正式的公众号.首先来介绍下微信扫码支付吧,微信扫码有两 ...
- Android驱动-Java入门学习(java安装)
在ubuntu 14.04上java开发环境. 下载 jdk-7u75-linux-x64.tar.gz 使用tar xvf jdk-7u75-linux-x64.tar.gz 解压 在/usr/li ...
- 浅析pagehelper分页原理
原文链接 https://blog.csdn.net/qq_21996541/article/details/79796117 之前项目一直使用的是普元框架,最近公司项目搭建了新框架,主要是由公司的大 ...
- 【分布式锁的演化】“超卖场景”,MySQL分布式锁篇
前言 之前的文章中通过电商场景中秒杀的例子和大家分享了单体架构中锁的使用方式,但是现在很多应用系统都是相当庞大的,很多应用系统都是微服务的架构体系,那么在这种跨jvm的场景下,我们又该如何去解决并发. ...
- 一个简单的springboot+mybatis-plus+thymeleaf的学生管理系统
一.登录功能 1.1登录所涉及的功能主要包括拦截器,过滤器,用户在未登录的时候,访问页面会阻止访问的,如图所示: 实现这个功能的主要代码如下所示 1 //拦截器 2 public class Logi ...
- 改进你的c#代码的5个技巧(一)
亲爱的读者,在这篇文章中,我提供了一些c#编程的最佳实践. 你是否在用户输入验证中使用异常处理机制? 如果是,那么你就是那个把你的项目执行速度降低了62倍的人.你不相信我吗?等几分钟;我来教你怎么做. ...
- 杭电OJ2007----平方和与立方和(易错题)
Problem Description 给定一段连续的整数,求出他们中所有偶数的平方和以及所有奇数的立方和. Input 输入数据包含多组测试实例,每组测试实例包含一行,由两个整数m和n组成. Out ...
- day116:MoFang:显示背包解锁/未解锁格子数&显示背包的道具物品&背包解锁
目录 1.显示背包的已解锁/未解锁格子数 2.显示背包中的道具物品 3.用户购买道具的时候,判断背包存储是否达到上限 4.道具也可以使用积分购买 5.在商城界面根据金额/积分显示不同商品 6.背包解锁 ...
- 【函数分享】每日PHP函数分享(2021-1-7)
ltrim() 删除字符串开头的空白字符(或其他字符). string ltrim ( string $str[, string $character_mask]) 参数描述str 输入的字符串. c ...