首页 > 代码库 > 【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 }
【poj2186】Popular Cows
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。