标签:des style http color os strong io for
Description
Input
Output
Sample Input
3 3 1 2 2 1 2 3
Sample Output
1
在对图进行建立时,如果用矩阵会导致内存超限,用VEC会使后来的缩点变得麻烦,所以用邻接表是最佳选择:
#include<stdio.h> #include<stack>; #include<string.h> using namespace std; stack<int>S; int dfn[10005],map[10005][110],low[10005],instack[10005],belong[10005],out[10005]; int index,bnt; void tarjan(int i){ dfn[i] = low[i] = ++index; S.push(i); instack[i] = 1; for(int j=1;j<=map[i][0];j++){ int k = map[i][j]; if(!dfn[k]){ tarjan(k); low[i] = min(low[i],low[k]); } else if(instack[k]){ low[i] = min(low[i],dfn[k]); } } if(low[i] == dfn[i]){ bnt ++; int k; do{ k = S.top(); S.pop(); instack[k] = 0; belong[k] = bnt; }while(i!=k); } } int main(){ int m,n,sum; while(~scanf("%d%d",&n,&m)){ int a,b,j; index = bnt = sum = 0; memset(map,0,sizeof(map)); memset(instack,0,sizeof(instack)); memset(out,0,sizeof(out)); memset(dfn,0,sizeof(dfn)); for(int i=0;i<m;i++){ scanf("%d%d",&a,&b); map[a][++map[a][0]] = b; } for(int i=1;i<=n;i++) if(!dfn[i]){ tarjan(i); } for(int i=1;i<=n;i++){ for(j = 1;j<=map[i][0];j++) if(belong[i]!=belong[map[i][j]]) out[belong[i]]++; } int z=0; for(int i=1;i<=bnt;i++){ if(out[i]==0){ z++; for(int j=1;j<=n;j++) if(belong[j]==i)sum++; } } if(z==1) printf("%d\n",sum); else printf("0\n"); } }
标签:des style http color os strong io for
原文地址:http://blog.csdn.net/yuanhanchun/article/details/38334657