做法:
把图中所有的圈缩成一个点,那么就是求是否存在一个点,使得所有的点都能到达。
遍历所有入度为0的点,对所有遍历到的出度为0的点的标记+1;
若出度为0的点的数目大于两个,则输出0。否则若标记的值等于入度点的和,那么输出这个点缩点之前含的点。
#include #include #include #include #include #include #include #include #include #define INF_MAX 0x7fffffff #define INF 999999 #define max3(a,b,c) (max(a,b)>c max(a,b):c) #define min3(a,b,c) (min(a,b)vec[maxn]; vectorvect[maxn]; stackst; int dnf[maxn],low[maxn],vis[maxn],sum[maxn],instack[maxn]; int du[maxn],du2[maxn]; int n,m; int times,num; void init() { int i; for(i=0;i<=n;i++) dnf[i]=low[i]=instack[i]=du[i]=du2[i]=vis[i]=sum[i]=0; times=1; num=1; for(i=0;i<=n;i++)vec[i].clear(); for(i=0;i<=n;i++)vect[i].clear(); while(!st.empty())st.pop(); } void tarjan(int x) { int i; dnf[x]=low[x]=times++; instack[x]=1; st.push(x); int n=vec[x].size(); for(i=0;iq; q.push(x); visit[x]=1; while(!q.empty()) { int y=q.front(); q.pop(); int len=vect[y].size(); int leap=0; for(i=0;i1) { cout<<"0"<