我们可以看出来,我们需要在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;
}