hdu3836 最强连通图,trajan算法...
来源:互联网 发布:淘宝服装宝贝描述素材 编辑:程序博客网 时间:2024/04/19 08:33
Equivalent Sets
Time Limit: 12000/4000 MS (Java/Others) Memory Limit: 104857/104857 K (Java/Others)Total Submission(s): 2953 Accepted Submission(s): 1039
Problem Description
To prove two sets A and B are equivalent, we can first prove A is a subset of B, and then prove B is a subset of A, so finally we got that these two sets are equivalent.
You are to prove N sets are equivalent, using the method above: in each step you can prove a set X is a subset of another set Y, and there are also some sets that are already proven to be subsets of some other sets.
Now you want to know the minimum steps needed to get the problem proved.
You are to prove N sets are equivalent, using the method above: in each step you can prove a set X is a subset of another set Y, and there are also some sets that are already proven to be subsets of some other sets.
Now you want to know the minimum steps needed to get the problem proved.
Input
The input file contains multiple test cases, in each case, the first line contains two integers N <= 20000 and M <= 50000.
Next M lines, each line contains two integers X, Y, means set X in a subset of set Y.
Next M lines, each line contains two integers X, Y, means set X in a subset of set Y.
Output
For each case, output a single integer: the minimum steps needed.
Sample Input
4 03 21 21 3
Sample Output
42HintCase 2: First prove set 2 is a subset of set 1 and then prove set 3 is a subset of set 1.
#include"stdio.h"#include"string.h"#include"stdlib.h"#include"stack"#define N 30000using namespace std;int n,m;int index_s;int instack[N],DFN[N],LOW[N];int belong[N],indegree[N],outdegree[N];struct Eage{ int from,to,next;}eage[2*N];int tot,head[N];void add(int a,int b){ eage[tot].from=a; eage[tot].to=b; eage[tot].next=head[a]; head[a]=tot++;}void getmap(){ int i,l; int a,b; tot=0; memset(head,-1,sizeof(head)); while(m--) {scanf("%d%d",&a,&b);add(a,b);}}stack<int>st;void Tarjan(int k){ int j,v; st.push(k); instack[k]=1; DFN[k]=LOW[k]=++index_s; for(j=head[k];j!=-1;j=eage[j].next) { v=eage[j].to; if(instack[v]) LOW[k]=LOW[k]>DFN[v]?DFN[v]:LOW[k]; else if(DFN[v]==-1) { Tarjan(v); LOW[k]=LOW[k]>LOW[v]?LOW[v]:LOW[k]; } } if(DFN[k]==LOW[k]) { do { j=st.top(); st.pop(); instack[j]=0; belong[j]=k; }while(j!=k); }}void getdegree(){ int i,l; memset(indegree,0,sizeof(indegree)); memset(outdegree,0,sizeof(outdegree)); for(i=0;i<tot;i++) { if(belong[eage[i].from]==belong[eage[i].to]) continue; indegree[belong[eage[i].to]]++; outdegree[belong[eage[i].from]]++; }}int main(){ int i; int temp,t1,t2,ans; while(scanf("%d%d",&n,&m)!=-1) { getmap(); index_s=0; memset(DFN,-1,sizeof(DFN)); memset(LOW,-1,sizeof(LOW)); memset(instack,0,sizeof(instack)); for(i=1;i<=n;i++) if(DFN[i]==-1) Tarjan(i); getdegree(); temp=t1=t2=0; for(i=1;i<=n;i++) { if(belong[i]!=i) continue; temp++; if(indegree[i]==0) t1++; if(outdegree[i]==0) t2++; } ans=t1>t2?t1:t2; if(n<1 || temp==1) ans=0; printf("%d\n",ans); } return 0;}
- hdu3836 最强连通图,trajan算法...
- 求有向图强连通分量:Trajan算法模板
- Trajan算法(强连通+缩点)
- trajan算法
- 有向图中寻找强连通分量(环)和拓扑排序——Kosaraju、Trajan、Gabow算法
- 有向图的强连通分量 hdu3836
- hdu3836 Equivalent Sets【强连通】
- Kosaraju算法求最强连通分量
- 2208: [Jsoi2010]连通数(Trajan+bitset)
- hdu3836 Equivalent Sets (至少加几条边让整个图变成强连通&hdu2767)
- 有向连通图增加多少边构成强联通(hdu3836)
- HDU3836--Equivalent Sets(强连通+缩点)
- 强连通 Tarjan+Kosaraju (HDU1269+hdu3836)
- poj2762 Going from u to v or from v to u?--trajan算法 & 强连通分量 & 缩点 & 拓扑排序
- hdu3836
- hdu3836
- hdu3836及Tarjon算法模板
- hdu3836 Equivalent Sets(有向图至少添加多少条边才能变为强连通图+tarjan缩点)
- ios 学习之你画我话绘图四 读取pdf (官方代码)
- HDU 4756 次小生成树裸题
- 源文件存放在虚拟机共享目录导致asp.net调试时[没有相关的源行]问题
- 黑马程序员_集合知识2
- iOS开发>>>NSData 与 NSString,Byte数组,UIImage 的相互转换
- hdu3836 最强连通图,trajan算法...
- linux C函数之strdup函数分析
- 黑马程序员_java面向对象
- 闭包使用之两类交互
- iOS开发>>>NSString常用方法
- 打造自己的vim界面--用winmanager合并显示NERDTree和TagList
- ubuntu安装jdk
- java.net.UnknownHostException 异常处理
- iOS开发>>>类&对象基础