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 }
posted on 2012-08-07 15:25  BFP  阅读(134)  评论(0)    收藏  举报