P3183 [HAOI2016]食物链
题目描述
如图所示为某生态系统的食物网示意图,据图回答第1小题现在给你n个物种和m条能量流动关系,求其中的食物链条数。物种的名称为从1到n编号M条能量流动关系形如a1 b1a2 b2a3 b3......am-1 bm-1am bm其中ai bi表示能量从物种ai流向物种bi,注意单独的一种孤立生物不算一条食物链
输入输出格式
输入格式:
第一行两个整数n和m,接下来m行每行两个整数ai bi描述m条能量流动关系。(数据保证输入数据符号生物学特点,且不会有重复的能量流动关系出现)1<=N<=100000 0<=m<=200000题目保证答案不会爆 int
输出格式:
一个整数即食物网中的食物链条数
输入输出样例
输入样例#1: 复制
10 16 1 2 1 4 1 10 2 3 2 5 4 3 4 5 4 8 6 5 7 6 7 9 8 5 9 8 10 6 10 7 10 9
输出样例#1: 复制
9
拓扑排序+dp
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define inf 2147483647 const ll INF = 0x3f3f3f3f3f3f3f3fll; #define ri register int template <class T> inline T min(T a, T b, T c) { return min(min(a, b), c); } template <class T> inline T max(T a, T b, T c) { return max(max(a, b), c); } template <class T> inline T min(T a, T b, T c, T d) { return min(min(a, b), min(c, d)); } template <class T> inline T max(T a, T b, T c, T d) { return max(max(a, b), max(c, d)); } #define pi acos(-1) #define me(x, y) memset(x, y, sizeof(x)); #define For(i, a, b) for (int i = a; i <= b; i++) #define FFor(i, a, b) for (int i = a; i >= b; i--) #define mp make_pair #define pb push_back const int maxn = 100005; #define mod 100003 const int N=100005; // name******************************* int n,m; struct edge { int to,next; } e[200005]; int in[N],out[N]; int tot=0; int Head[N]; int f[N]; int ans=0; // function****************************** void add(int u,int v) { e[++tot].to=v; e[tot].next=Head[u]; Head[u]=tot; out[u]++; in[v]++; } void dfs(int u) { for(int p=Head[u]; p!=-1; p=e[p].next) { int v=e[p].to; f[v]+=f[u]; if(!--in[v]) dfs(v); } } //*************************************** int main() { //freopen("test.txt", "r", stdin); cin>>n>>m; me(Head,-1); For(i,1,m) { int a,b; cin>>a>>b; add(a,b); } For(i,1,n) { if(in[i]==0&&out[i]!=0&&f[i]==0) { f[i]=1; dfs(i); } } For(i,1,n) { if(out[i]==0) ans+=f[i]; } cout<<ans; return 0; }