【HAOI2016】食物鏈
阿新 • • 發佈:2018-08-28
continue line 一個點 href eof ++ 只有一個 pen con
【HAOI2016】食物鏈
題意
找出一個符合生物學定理的有向圖中的所有不同的鏈的個數。
解法
暴力記憶化搜索就行了。註意只有一個點的鏈不算食物鏈。
代碼
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <cctype> #include <vector> #define INF 2139062143 #define MAX 0x7ffffffffffffff #define del(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; template<typename T> inline void read(T&x) { x=0;T k=1;char c=getchar(); while(!isdigit(c)){if(c==‘-‘)k=-1;c=getchar();} while(isdigit(c)){x=x*10+c-‘0‘;c=getchar();}x*=k; } const int maxn=100000+5; vector<int> G[maxn]; int _in[maxn],_out[maxn]; int dp[maxn]; int dfs(int cur,int fa) { if(dp[cur]) return dp[cur]; if(!_out[cur]) return dp[cur]=1; for(int i=0;i<G[cur].size();i++) { int v=G[cur][i]; if(v==fa) continue; dp[cur]+=dfs(v,cur); } return dp[cur]; } int n,m; int main() { read(n),read(m); for(int i=1;i<=m;i++) { int u,v; read(u),read(v); _out[u]++,_in[v]++; G[u].push_back(v); } int ans=0; for(int i=1;i<=n;i++) if(!_in[i]&&_out[i]) ans+=dfs(i,0); printf("%d",ans); return 0; }
【HAOI2016】食物鏈