首页 > 编程知识 正文

有向无环图的关键路径,go有向无环图怎么看

时间:2023-05-05 14:58:45 阅读:159576 作者:3307

/*

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; () ) ) ) )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。