/*
Problem B:有向无环图
time limit 33605 secmemorylimit 3360128 MB
submit : 20解决方案: 11
[Submit][Status][Web Board]
描述
Bobo有n个点,这是m条边的有向无环图(即,对于给定点v,没有从点v开始并以点v结束的路径)。
为了方便,指向1、2、…、n号。 count(x,y )表示从点x到点y不同的路径数(设count(x,x )=0),Bobo想知道
针对所有的I,j求出f(e ) I,j ) * ) AI,bj )
除以(109 )的馀数。 但是,f(e ) I,j ) )表示i—所有边的数量。
在此,ai,bj是给定的数列。
输入
输入15组以下的数据。
每组数据的第一行包括两个整数n,m(1n,m105 )。
接下来的第n行的第I行包括两个整数ai,bi(0AI,bi109 )。
最后m行的第I行包含两个整数ui,vi,表示从点ui到vi的边。 (1ui,vin )。
Output
对于每组数据,输出一个表示请求值的整数。
样品输入
3 3
1 1
1 1
1 1
1 2
1 3
2 3
2 2
1 0
0 2
1 2
1 2
2 1
500000000 0
0 500000000
1 2
样品输出
4
4
250000014
*/
/*
题意:给定有向无环图,顶点编号1~n,m条边(注意,多重图),同时ai,bi,1=i=n; 求:所有1=i,j=n,count(I,j ) a ) I ) b ) j )的和,对1e9 7取模型。
构想:在回来的车上教练讨论过。 听着,我不太明白。 在那之后,我自己思考了一下。 感觉非常好。 然后等待再现Orz…
主要是求解的顺序很奇怪,是拓扑序列。 dfs一般超时,bfs将o(n )分层。 每次计算角度为零的顶点v及其相邻点u的值,然后
如果将该顶点v的a累计到下一个顶点u(v-u ),则从u计算到其相邻的点w时,由于a[u]中实际上包含a[v],所以计算为u-w
顺便也计算v-w; 不得不说真是很棒的解法。 呃! 呃!
*/
# include cstdio # include cstring # include iostream # include vector # includequeueusingnamespacestd; typedef long ll; const LL mod=1e9 7; const int maxn=1e5 100; int n,m; int a[maxn],b[maxn]; vectorint G[maxn]; int vis[maxn]; void init () ) for ) intI=1; i=n; I ) { vis[i]=0; G[i].clear (; }}int main () (/Freopen ) ) d:in.txt )、) r )、stdin ); while(scanf('%d%d ),n,m )==2) { init; for(intI=1; i=n; I ) scanf('%d%d ',a[i],b[i]; }for(intI=1; i=m; I ) { int a,b; scanf('%d%d ),a,b ); g[a].push_back(b ); vis[b]; ) } queueLL que; for(intI=1; i=n; I ) if (! vis[i] () que.push ) I; (//所有入站均为零的入队) } LL res=0; while (! que.empty () ) { int v=que.front; que.pop (; for(intI=0; I(int ) g ) v ).size ); I({intu=g[v][I]; RES=(RES ) a[v]%mod ) * (b[u]%mod ) %mod ) %mod; a[u]=(a[u]a[v] ) %mod; //将当前结果的一部分加到下一个顶点上vis[u]--; if (! vis[u] ()//入度为零且que.push(u ); } } } coutres%modendl; } return 0; () ) ) ) )。