2016第十二届湖南省赛 B-有向无环图(拓扑排序)

mac2024-05-07  29

 

#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e5 + 5; const int mod = 1e9+7; ll a[maxn],b[maxn]; vector<int> G[maxn]; queue<int> q; int in[maxn]; int n,m; void init(){ memset(in,0,sizeof(in)); for(int i=1;i<=n;i++) G[i].clear(); } int main() { while(~scanf("%d%d",&n,&m)) { int u,v; init(); for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i],&b[i]); for(int i=1;i<=m;i++) { scanf("%d%d",&u,&v); G[u].push_back(v); in[v]++; } for(int i=1;i<=n;i++) if(!in[i]) q.push(i); ll ans=0; while(!q.empty()) { u=q.front(); q.pop(); for(auto it : G[u]){ v = it; ans = (ans+(a[u]*b[v])%mod)%mod; a[v] =(a[v]+a[u])%mod; in[v]--; if(!in[v]) q.push(v); } } printf("%lld\n",ans); } }

 

最新回复(0)