【洛谷p3183】食物链
这个题……比赛的时候沙茶了一把,没打出来,考完后略作改动就过了【流泪】
这个题……我真是用拓扑排序做的……没用什么奇奇怪怪的dp,dfs,稍微用了点小技巧qwq,对到达某个点的方案数做了下记录下面放代码
#include<iostream> #include<cstdio> #include<vector> #include<queue> using namespace std; int n,m,x,y,ans; vector<int>mmp[100010]; int jin[100010],chu[100010],ci[100010]; inline void build(int f,int l) //inline真的有用!相信我,我用它拯救了个tle的程序{ mmp[f].push_back(l); return; } queue<int>qwq; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) scanf("%d%d",&x,&y),jin[y]++,chu[x]++,build(x,y); for(int i=1;i<=n;i++) if(!jin[i]&&chu[i]) qwq.push(i),ci[i]=1; while(!qwq.empty()) { int qaq=qwq.front(); if(!chu[qaq]) ans+=ci[qaq]; qwq.pop(); for(int i=0;i<mmp[qaq].size();i++) { int t=mmp[qaq][i]; jin[t]--,ci[t]+=ci[qaq]; if(!jin[t]) qwq.push(t); } } cout<<ans; }