poj 2186 Popular Cows
未完成,TLE要查:
1 #include<stdio.h> 2 #include<string.h> 3 #define MAXN 10000 + 10 4 5 int first[MAXN], next[50010],u[MAXN],v[MAXN],n, m, ans1; 6 int dfn[MAXN],low[MAXN],col[MAXN],stk[MAXN],ins[MAXN],ind,top,cols,tmp; 7 int outdg[MAXN],zeroout; 8 9 void dfs(int u) 10 { 11 dfn[u] = low[u] = ++ind; 12 stk[++top] = u, ins[u] = 1; 13 for(int i = first[u]; i != -1; i = next[i]) 14 { 15 int ve = v[i]; 16 if(!dfn[ve]) 17 { 18 dfs(ve); 19 if(low[ve] < low[u]) low[u] = low[ve]; 20 } 21 else if(ins[ve]) 22 { 23 if(dfn[ve] < low[u]) low[u] = dfn[ve]; 24 } 25 } 26 if(dfn[u] == low[u]) 27 { 28 cols++; 29 do 30 { 31 tmp = stk[top --]; 32 col[tmp] = cols; 33 ins[tmp] = 0; 34 } 35 while(tmp != u); 36 } 37 } 38 39 void tarjan(int n) 40 { 41 ans1 = zeroout = 0; 42 memset(dfn, 0, sizeof(dfn[0])*(n+10)); 43 memset(low, 0, sizeof(low[0])*(n+10)); 44 memset(col, 0, sizeof(col[0])*(n+10)); 45 memset(stk, 0, sizeof(stk[0])*(n+10)); 46 memset(ins, 0, sizeof(ins[0])*(n+10)); 47 ind = top = cols = 0; 48 for(int i = 1; i <= n; i ++) 49 { 50 if(!dfn[i]) dfs(i); 51 } 52 if(cols == 1) 53 { 54 ans1 = n; 55 return ; 56 } 57 memset(outdg, 0, sizeof(outdg)); 58 for(int i = 0; i < m; i ++) 59 { 60 if(col[u[i]] == col[v[i]]) continue; 61 outdg[col[u[i]]] ++; 62 } 63 int flag = 0; 64 for(int i = 1; i <= cols; i ++) 65 { 66 if(outdg[i] == 0) {zeroout ++;flag = i;} 67 } 68 if(zeroout == 1) 69 { 70 for(int i = 1; i <= n; i ++) 71 if(col[i] == flag) {ans1++;} 72 } 73 } 74 75 int main() 76 { 77 while(scanf("%d%d",&n,&m) == 2) 78 { 79 memset(first, -1, sizeof(first[0])*(n+10)); 80 for(int i = 0; i < m; i ++) 81 { 82 scanf("%d%d",&u[i],&v[i]); 83 next[i] = first[u[i]]; 84 first[u[i]] = i; 85 } 86 tarjan(n); 87 printf("%d\n",end-star); 88 printf("%d\n", ans1); 89 } 90 return 0; 91 }
浙公网安备 33010602011771号