We need a topology.
#include <iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<queue>#defineMAXV 100500#defineMaxe 200500using namespacestd;intN,m,x,y,g[maxv],nume=1, d[maxv],size[maxv],ans=0; queue<int>Q;BOOLFLAG[MAXV];structpnt{intId,rank;} P[MAXV];structedge{intV,NXT;} E[maxe];BOOLCMP (PNT X,pnt y) {returnx.rank<Y.rank;}voidAddedge (intUintv) {e[++nume].v=v; E[NUME].NXT=G[u]; G[u]=Nume;}voidTopusort () { for(intI=1; i<=n;i++) { if(!D[i]) {P[i].rank=1; Q.push (i); } } while(!Q.empty ()) { intHead=Q.front (); Q.pop (); for(intI=g[head];i;i=e[i].nxt) { intv=e[i].v; if(!--D[v]) {P[v].rank=p[head].rank+1; Q.push (v); } } }}intMain () {scanf ("%d%d",&n,&m); for(intI=1; i<=m;i++) {scanf ("%d%d",&x,&y); Addedge (x, y);d [y]++; } for(intI=1; i<=n;i++) p[i].id=i; Topusort (); Sort (P+1, p+n+1, CMP); for(inti=n;i>=1; i--) { intx=p[i].id; for(intj=g[x];j;j=e[j].nxt) { intv=e[j].v; FLAG[X]=true; size[x]+=Size[v]; } if(!flag[x]) size[x]=1; } for(intI=1; i<=n;i++) { if((p[i].rank==1) && (Flag[p[i].id]) ans+=Size[p[i].id]; Else if(p[i].rank!=1) Break; } printf ("%d\n", ans); return 0;}
Bzoj 4562 food Chain