HDOJ 3836 Equivalent Sets
来源:互联网 发布:ndcg优化 编辑:程序博客网 时间:2024/05/16 05:13
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3836
这道题目和HDOJ上的那道Proving Equivalences可谓是一样的(可能唯一的区别就是一道要输入多组数据,一道不用……),这题的题意是说问我们最少再加多少边可以让这张图成为一个强连通图,上来我们仍然先缩点,建立DAG图,再统计每一个DAG点的入度与出度,再统计入度为0的点和出度为0的点的个数,这里采取的贪心策略是看入度为0的点多还是出度为0的点多,我们要加的最少的边就是这个最大值了。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int VM=20010; const int EM=50010; const int INF=0x3f3f3f3f; struct Edge { int to,nxt; }edge[EM<<1]; int n,m,cnt,head[VM]; int dep,top,num; int dfn[VM],low[VM],vis[VM],stack[VM],belong[VM],indeg[VM],outdeg[VM]; void addedge(int cu,int cv) { edge[cnt].to=cv; edge[cnt].nxt=head[cu]; head[cu]=cnt++; } void Tarjan(int u) { dfn[u]=low[u]=++dep; stack[top++]=u; vis[u]=1; for(int i=head[u];i!=-1;i=edge[i].nxt) { int v=edge[i].to; if(!dfn[v]) { Tarjan(v); low[u] = min(low[u],low[v]); } else if(vis[v]) low[u] = min(low[u],dfn[v]); } int v; if(dfn[u]==low[u]) { num++; do { v = stack[--top]; belong[v] = num; vis[v] = 0; }while(u != v); } } void init() { cnt=0; memset(head,-1,sizeof(head)); dep = top = num = 0; memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(vis,0,sizeof(vis)); memset(belong,0,sizeof(belong)); memset(indeg,0,sizeof(indeg)); memset(outdeg,0,sizeof(outdeg)); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { if(n==1) { printf("0\n"); continue; } if(m==0) { printf("%d\n",n); continue; } init(); int u,v; while(m--) { scanf("%d%d",&u,&v); addedge(u,v); } for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i); if(num == 1) { printf("0\n"); continue; } for(int u=1;u<=n;u++) for(int i=head[u];i!=-1;i=edge[i].nxt) { int v=edge[i].to; if(belong[u]!=belong[v]) { outdeg[belong[u]]++; indeg[belong[v]]++; } } int ans1=0,ans2=0; for(int i=1; i<=num; i++) { if(indeg[i]==0) ans1++; if(outdeg[i]==0) ans2++; } printf("%d\n",max(ans1,ans2)); } return 0; }
0 0
- HDOJ 3836 Equivalent Sets
- hdoj 3836 Equivalent Sets
- HDOJ/HDU 3836 Equivalent Sets
- HDU/HDOJ 3836 Equivalent Sets 多校联合1
- 【强连通分量+缩点】 HDOJ 3836 Equivalent Sets
- HDOJ 题目3836 Equivalent Sets(强连通分量)
- hdoj 3836 Equivalent Sets 【tarjan 求SCC + 缩点】
- hdu 3836 Equivalent Sets
- hdu 3836 Equivalent Sets
- HDU 3836 Equivalent Sets
- hdu 3836 Equivalent Sets
- [图论] hdu 3836 Equivalent Sets
- [tarjan] hdu 3836 Equivalent Sets
- HDU 3836 — Equivalent Sets
- hdu acm 3836 Equivalent Sets
- hdoj Equivalent Sets 3836 (强连通分量 最少添加几条边使图强连通)
- HDOJ--3836--Equivalent Sets(tarjan算法)//求连接几个SCC最少的边
- HDU 3836 Equivalent Sets 强连通分量
- 【ssh-keygen】生成、管理和转换认证密钥
- java 回调函数
- 彭鑫博士:黑芝麻补精粥
- css中float和clear属性
- 【POJ】1852 - Ants(数学问题,思路)
- HDOJ 3836 Equivalent Sets
- Redis运行多个实例以充分发挥多核处理器的能力
- win7开机后svchost..exe占用CPU和内存很高的解决方法
- 工控系统蜜罐建设与协议仿真技术分享
- 用CornerStone配置SVN,HTTP及svn简单使用说明
- 【awk】文本处理
- 常用正则表达式
- POJ-2752(KMP(Seek the Name, Seek the Fame))
- 【java学习】不同类型的转换