AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=4562
【吐槽】
这明明是拓扑排序的一道水题,却被诸多人黑成了动态规划。。。
注意:单独的一个点不能算一条食物链,这点坑了许多人(学好生物很重要&&出题人丧心病狂)
/*************
bzoj 4562
by chty
2016.11.21
*************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<algorithm>
using namespace std;
#define FILE "read"
#define MAXN 100010
#define MAXM 200010
#define up(i,j,n) for(int i=j;i<=n;i++)
#define down(i,j,n) for(int i=j;i>=n;i--)
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
struct node{int y,next;}e[MAXM];
int n,m,len,ans,Link[MAXN],in[MAXN],out[MAXN],check[MAXN],f[MAXN],q[MAXN];
namespace Init{
char buf[1<<15],*fs,*ft;
inline char getc(){return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
inline int read(){
int x=0,f=1; char ch=getc();
while(!isdigit(ch)) {if(ch=='-') f=-1; ch=getc();}
while(isdigit(ch)) {x=x*10+ch-'0'; ch=getc();}
return x*f;
}
}using namespace Init;
void insert(int x,int y){e[++len].next=Link[x];Link[x]=len;e[len].y=y;in[y]++;out[x]++;check[y]=1;}
void init(){
n=read(); m=read();
up(i,1,m) {int x=read(),y=read(); insert(x,y);}
}
void topsort(){
int head(0),tail(0);
up(i,1,n) if(!in[i]) q[++tail]=i,f[i]=1;
while(++head<=tail){
int x=q[head];
for(int i=Link[x];i;i=e[i].next){
if(--in[e[i].y]==0) q[++tail]=e[i].y;
f[e[i].y]+=f[x];
}
}
up(i,1,n) if(!out[i]&&check[i]) ans+=f[i];
printf("%d\n",ans);
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
init();
topsort();
return 0;
}