标签:sed clu get first 大小 http add alt efi
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 }
标签:sed clu get first 大小 http add alt efi
原文地址:http://www.cnblogs.com/lxtx/p/7009983.html