记录编号 442588 评测结果 AAAAAAAAAA
题目名称 [HAOI 2016]食物链 最终得分 100
用户昵称 GravatarHyoi_iostream 是否通过 通过
代码语言 C++ 运行时间 0.746 s
提交时间 2017-08-27 20:47:49 内存使用 3.56 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int u[200001],v[200001],summ[100001];//记忆搜索 
int first[100001],next[200001];//邻接表 
int sum=0,n,m;
bool a[100001],b[100001];//a表示有出边,b表示有边指向它 
inline void dfs(int x,int y){
	if(summ[x]!=0)
	   return;
	if(a[x]==0){
		summ[y]++; 
		//cout<<x<<endl;
		return;
	}
	int k=first[x];
	while(k!=0){
		dfs(v[k],x);
		summ[x]+=summ[v[k]];
		k=next[k];
	}
	if(y==0)
	    sum+=summ[x];
	return;
}
int main(){
	freopen("chain_2016.in","r",stdin);
	freopen("chain_2016.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>u[i]>>v[i];
		next[i]=first[u[i]];
		first[u[i]]=i;
		a[u[i]]=1;
		b[v[i]]=1;
	}
	for(int i=1;i<=n;i++){
		if(b[i]==0&&a[i]==1){
			dfs(i,0);//从最下面开始 
		}
	}
	cout<<sum;
	fclose(stdin);
	fclose(stdout);
	return 0;
}