标签:
Description
Input
Output
Sample Input
5 2 4 3 0 4 5 0 0 0 1 0
Sample Output
1 2
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<stack> 5 #include<algorithm> 6 using namespace std; 7 8 stack<int>s; 9 vector<int>G[105]; 10 int dfn[105],sccno[105],in[105],out[105],lowlink[105]; 11 int n,dfs_clock,scc_cnt; 12 13 void init() 14 { 15 memset(lowlink,0,sizeof(lowlink)); 16 memset(dfn,0,sizeof(dfn)); 17 memset(in,0,sizeof(in)); 18 memset(out,0,sizeof(out)); 19 memset(sccno,0,sizeof(sccno)); 20 for(int i=1;i<=n;i++)G[i].clear(); 21 dfs_clock=scc_cnt=0; 22 } 23 24 void tarjan(int u) 25 { 26 lowlink[u]=dfn[u]=++dfs_clock; 27 s.push(u); 28 for(int i=0;i<G[u].size();i++) 29 { 30 int v=G[u][i]; 31 if(!dfn[v]) 32 { 33 tarjan(v); 34 lowlink[u]=min(lowlink[u],lowlink[v]); 35 } 36 else if(!sccno[v]) 37 lowlink[u]=min(lowlink[u],dfn[v]); 38 } 39 if(lowlink[u]==dfn[u]) 40 { 41 scc_cnt++; 42 while(1) 43 { 44 int x=s.top(); 45 s.pop(); 46 sccno[x]=scc_cnt; 47 if(x==u)break; 48 } 49 } 50 } 51 52 int main() 53 { 54 while(scanf("%d",&n)!=EOF) 55 { 56 init(); 57 for(int i=1;i<=n;i++) 58 { 59 int tmp; 60 while(scanf("%d",&tmp),tmp) 61 G[i].push_back(tmp); 62 } 63 for(int i=1;i<=n;i++) 64 if(!dfn[i]) 65 tarjan(i); 66 for(int i=1;i<=n;i++) 67 for(int j=0;j<G[i].size();j++) 68 if(sccno[i]!=sccno[G[i][j]]) 69 { 70 out[sccno[i]]++; 71 in[sccno[G[i][j]]]++; 72 } 73 int cnt1=0,cnt2=0; 74 for(int i=1;i<=scc_cnt;i++) 75 { 76 if(!in[i]) 77 cnt1++; 78 if(!out[i]) 79 cnt2++; 80 } 81 if(scc_cnt==1) 82 printf("1\n0\n"); 83 else 84 printf("%d\n%d\n",cnt1,max(cnt1,cnt2)); 85 } 86 return 0; 87 }
POJ 1236 Network of Schools(强联通缩点)
标签:
原文地址:http://www.cnblogs.com/homura/p/4853241.html