我们可以看出来,我们需要在DAG上面统计有多少到达某个点的路径数。
这不就是拓扑排序吗?
我们在拓扑排序时,传递a的值,最后计算答案即可、但是减法取模错了,WA了几次。。。。
AC代码:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10,p=1e9+7;
int n,m,a[N],b[N],in[N],s[N];
int head[N],to[N],nex[N],tot;
inline void add(int a,int b){
to[++tot]=b; nex[tot]=head[a]; head[a]=tot;
}
inline void init(){
tot=0; memset(head,0,sizeof head); memset(in,0,sizeof in);
}
int top_sort(){
int res=0;
queue<int> q; for(int i=1;i<=n;i++) if(!in[i]) q.push(i);
while(q.size()){
int u=q.front(); q.pop();
for(int i=head[u];i;i=nex[i]){
a[to[i]]=(a[to[i]]+a[u])%p;
if(--in[to[i]]==0) q.push(to[i]);
}
}
for(int i=1;i<=n;i++) res=(res+(a[i]-s[i]+p)*b[i]%p)%p;
return res;
}
signed main(){
while(~scanf("%lld %lld",&n,&m)){
init();
for(int i=1;i<=n;i++) scanf("%lld %lld",&a[i],&b[i]),s[i]=a[i];
while(m--){
int a,b; scanf("%lld %lld",&a,&b); add(a,b); in[b]++;
}
printf("%lld\n",top_sort());
}
return 0;
}