BZOJ1093 [ZJOI2007]最大半连通子图
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
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- struct X
- {
- int v,n,f;
- }x[],y[];
- const int N=1e5+;
- int s,st[N],top,dfn[N],low[N],pa[N],cnt,t,w=-,q[N],syg[N];
- bool vis[N],sf[N];
- void add(int u,int v)
- {
- y[++s].n=y[u].f;
- y[y[u].f=s].v=v;
- }
- void dfs(int u)
- {
- dfn[u]=low[u]=++s;
- vis[st[++top]=u]=sf[u]=;
- for(int i=x[u].f;i;i=x[i].n)
- if(!vis[x[i].v]) dfs(x[i].v),low[u]=min(low[x[i].v],low[u]);
- else if(sf[x[i].v]) low[u]=min(low[u],dfn[x[i].v]);
- if(dfn[u]==low[u])
- {
- pa[u]=++cnt;
- for(;st[top]!=u;top--)
- pa[st[top]]=cnt,sf[st[top]]=;
- top--;sf[u]=;
- }
- }
- int main()
- {
- int n,m,mod;
- scanf("%d%d%d",&n,&m,&mod);
- for(int i=;i<=m;i++)
- {
- int u;
- scanf("%d%d",&u,&x[i].v);
- x[i].n=x[u].f;
- x[u].f=i;
- }
- for(int i=;i<=n;i++)
- if(!vis[i]) dfs(i);
- memset(st,,sizeof(st));
- memset(dfn,,sizeof(dfn));
- memset(vis,,sizeof(vis));
- s=;
- for(int i=;i<=n;i++)
- {
- st[pa[i]]++;
- for(int j=x[i].f;j;j=x[j].n)
- if(pa[i]!=pa[x[j].v]) add(pa[i],pa[x[j].v]),++dfn[pa[x[j].v]];
- }
- memset(pa,,sizeof(pa));
- memset(low,,sizeof(low));
- for(int i=;i<=cnt;i++)
- if(!dfn[i]) vis[q[++w]=i]=,low[i]=,pa[i]=st[i];
- for(;t<=w;t++)
- {
- for(int i=y[q[t]].f;i;i=y[i].n)
- if(!vis[y[i].v])
- {
- dfn[y[i].v]--;
- if(!dfn[y[i].v]) vis[q[++w]=y[i].v]=;
- if(syg[y[i].v]==q[t]) continue;
- syg[y[i].v]=q[t];
- if(st[y[i].v]+pa[q[t]]>pa[y[i].v])
- {
- pa[y[i].v]=pa[q[t]]+st[y[i].v];
- low[y[i].v]=low[q[t]];
- }
- else if(st[y[i].v]+pa[q[t]]==pa[y[i].v]) low[y[i].v]+=low[q[t]],low[y[i].v]%=mod;
- }
- }
- int ans1=,ans2;
- for(int i=;i<=cnt;i++)
- if(ans1<pa[i]) ans1=pa[i],ans2=low[i];
- else if(ans1==pa[i]) ans2+=low[i],ans2%=mod;
- printf("%d\n%d",ans1,ans2);
- return ;
- }
BZOJ1093 [ZJOI2007]最大半连通子图的更多相关文章
- bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)
Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...
- bzoj1093: [ZJOI2007]最大半连通子图 scc缩点+dag上dp
一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...
- BZOJ1093 [ZJOI2007]最大半连通子图 【tarjan缩点 + DAG最长路计数】
题目 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意 两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G ...
- BZOJ1093: [ZJOI2007]最大半连通子图(tarjan dp)
题意 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G' ...
- 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图
思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...
- BZOJ1093 ZJOI2007最大半连通子图(缩点+dp)
发现所谓半连通子图就是缩点后的一条链之后就是个模板题了.注意缩点后的重边.写了1h+真是没什么救了. #include<iostream> #include<cstdio> # ...
- 2018.11.06 bzoj1093: [ZJOI2007]最大半连通子图(缩点+拓扑排序)
传送门 先将原图缩点,缩掉之后的点权就是连通块大小. 然后用拓扑排序统计最长链数就行了. 自己yyyyyy了一下一个好一点的统计方法. 把所有缩了之后的点都连向一个虚点. 然后再跑拓扑,这样最后虚点的 ...
- BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)
题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...
- BZOJ 1093 [ZJOI2007]最大半连通子图
1093: [ZJOI2007]最大半连通子图 Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1986 Solved: 802[Submit][St ...
随机推荐
- 关于语句#ifdef OS_GLOBALS #define OS_EXT #else #define OS_EXT extern #endif 的说明
声明全局变量使用的技术——摘自uC/OS-II中文版 以下是如何定义全局 变量.众所周知,全局变量应该是得到内存分配且可以被其他模块通过C 语言中extern 关键字调用的变量.因此,必须在 .C 和 ...
- 坑的可以呀re
.findall() 直接匹配字母和数字 元字符:. ^ $ * + ? {} [] () \ import re print(re.findall("alex"," ...
- Vs2015智能提示英文?
Vs2015智能提示英文? 装了vs2015代码的智能提示全部变成英文了 找到这个目录 C:\Program Files (x86)\Reference Assemblies\Microsoft\ ...
- Flask最佳实践
https://zhuanlan.zhihu.com/p/22774028?refer=python-cn
- Centos6.4 aria2 webui-aria2
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm rpm -ivh ...
- R&S学习笔记(二)
1.OSPF:路由条目1万多条.收敛时间1s:ISIS:路由条目可以达2万多条,收敛时间50ms().ISIS在链路层上面,不依赖IP这层,这样给了它很多可能.比如IPv4, IPv6路由的混合承载, ...
- 安装了多个Oracle11g的客户端,哪个客户端的tnsnames.ora会起作用?
如果我们由于需要安装了多个Oracle的client,哪个客户端的tnsnames.ora会起作用呢? 答案是: 在安装好clinent端后,安装程序会把client的bin目录放到path里面,pa ...
- 天地图应用ArcGIS发布的服务
本文包含三个部分:利用ArcMap将Excel的数据转化为ArcGIS MXD文件.利用ArcMap发布服务.天地图添加ArcGIS发布的服务. 一 MXD文件的生成 假设在Excel中存有两个点的坐 ...
- JSON.parse
摘自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse The J ...
- java 获取当月第一天和最后一天 获取前一个月第一天和最后一天
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); //获取前月的第一 ...