首页 > 代码库 > 【poj2186】Popular Cows

【poj2186】Popular Cows

传送门

 

tarjan缩点后是个DAG,然后只有一个出度为0的点的话就输出该点的大小,否则为0。

技术分享
 1 #include<cstdio>
 2 #define repu(i,x,y) for(i=x;i<=y;i++)
 3 #define min(a,b) (a<b?a:b)
 4 #define N 50001
 5 struct edge{
 6     int v;
 7     edge *next;
 8 }e[N],*tp=e,*first[N];
 9 int dfn[N],low[N],a[N],f[N],d[N],s[N],x=0,top=0,cnt;
10 void add(int u,int v) {
11     *tp=(edge){v,first[u]}; first[u]=tp++;
12 }
13 void tarjan(int u) {
14     dfn[u]=low[u]=++cnt; f[u]=1; a[++top]=u;
15     for (edge *i=first[u];i;i=i->next) {
16         int v=i->v;
17         if (!dfn[v]) {
18             tarjan(v);
19             low[u]=min(low[u],low[v]);
20         }
21         if (f[v]) low[u]=min(low[u],dfn[v]);
22     }
23     if (dfn[u]==low[u]) {
24         x++; int t;
25         do {
26             t=a[top];
27             f[t]=0,d[t]=x,++s[x],--top;
28         }
29         while (t!=u);
30     }
31 }
32 int main() {
33     int n,m,i,u,v,ans=0; scanf("%d%d",&n,&m);
34     repu(i,1,m) scanf("%d%d",&u,&v),add(u,v);
35     repu(i,1,n)
36         if (!dfn[i]) cnt=0,tarjan(i);
37     repu(i,1,n)
38         for (edge *j=first[i];j;j=j->next) {
39             int v=j->v;
40             if (d[i]!=d[v]) f[d[i]]=1;
41         }
42     cnt=0;
43     repu(i,1,x)
44         if (!f[i]) ans+=s[i],cnt++;
45     printf("%d\n",cnt>=2?0:ans);
46 }
View Code

 

【poj2186】Popular Cows