双倍经验

P4017 最大食物链计数

这样就行了: ``` #include<iostream> #include<cstdio> typedef long long ll; #define maxn 5001 #define maxm 1000001 #define mod 80112002 ll n,m; struct Edge { ll v,nxt; }e[maxm]; ll cnt=0,last[maxn],din[maxn],dout[maxn]; void adde(ll u,ll v) { ++cnt; ++dout[u];++din[v]; e[cnt].v=v; e[cnt].nxt=last[u];last[u]=cnt; } ll f[maxn]; struct que { ll a[maxn<<1|1],h,t; que(){h=t=1;} void push(ll x) { a[t++]=x; } void pop(){++h;} ll front() { return a[h]; } bool empty() { return h==t; } }q; void topo() { for(ll i=1;i<=n;++i) if(!din[i])q.push(i),f[i]=1; while(!q.empty()) { ll u=q.front();q.pop(); for(ll i=last[u];i;i=e[i].nxt) { f[e[i].v]+=f[u]; f[e[i].v]%=mod; if(!--din[e[i].v])q.push(e[i].v); } } } int main() { scanf("%lld%lld",&n,&m); ll u,v; for(ll i=1;i<=m;++i) { scanf("%lld%lld",&u,&v); adde(u,v); } topo(); ll ans=0; for(ll i=1;i<=n;++i) if(!dout[i])ans=(ans+f[i])%mod; printf("%lld",ans); return 0; } ```
by 陈启旺 @ 2019-04-09 21:14:01



by comfort @ 2019-04-09 21:30:08


@[刷水题的蒟蒻](/space/show?uid=48981) orz lyc
by _bql @ 2019-07-11 15:55:44


|