1804: 有向无环图

1804: 有向无环图

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 341  Solved: 152
[Submit][Status][Web Board]

Description

Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始、点 v 结束的路径)。

为了方便,点用 1,2,…,n 编号。 设 count(x,y) 表示点 x 到点 y 不同的路径数量(规定 count(x,x)=0),Bobo 想知道

除以 (109+7) 的余数。

其中,ai,bj 是给定的数列。

Input

输入包含不超过 15 组数据。

每组数据的第一行包含两个整数 n,m (1≤n,m≤105).

接下来 n 行的第 i 行包含两个整数 ai,bi (0≤ai,bi≤109).

最后 m 行的第 i 行包含两个整数 ui,vi,代表一条从点 ui 到 vi 的边 (1≤ui,vi≤n)。

Output

对于每组数据,输出一个整数表示要求的值。

Sample Input

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

Sample Output

4
4
250000014
思路:拓扑排序+dp;按照拓扑将点权合并就可以了。
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 #include<iostream>
 5 #include<math.h>
 6 #include<queue>
 7 #include<vector>
 8 using namespace std;
 9 typedef  long long LL;
10 LL mod = 1e9+7;
11 LL dp[100005];
12 int cnt[100005];
13 LL a[100005];
14 LL b[100005];
15 vector<int>vec[100005];
16 queue<int>que;
17 int main(void)
18 {
19         int n,m;
20         while(scanf("%d %d",&n,&m)!=EOF)
21         {
22                 int i,j;LL ask ;
23                 while(!que.empty())
24                         que.pop();
25                 for(i = 0; i < 100005; i++)
26                         vec[i].clear();
27                 memset(cnt,0,sizeof(cnt));
28                 memset(dp,0,sizeof(dp));
29                 for(i = 1; i <= n; i++)
30                 {
31                         scanf("%lld %lld",&a[i],&b[i]);
32                 }
33                 while(m--)
34                 {
35                         int x,y;
36                         scanf("%d %d",&x,&y);
37                         cnt[y]++;
38                         vec[x].push_back(y);
39                 }
40                 for(i = 1; i <= n; i++)
41                 {
42                         if(cnt[i] == 0)
43                         {
44                                 que.push(i);
45                         }
46                 }
47                 while(!que.empty())
48                 {
49                     int x = que.front();
50                     que.pop();
51                     for(i = 0;i < vec[x].size();i++)
52                     {
53                         int y = vec[x][i];
54                         cnt[y] --;
55                         if(cnt[y] == 0)
56                             que.push(y);
57                         dp[y] = dp[y]+a[x]*b[y]%mod;
58                         dp[y]%=mod;
59                         a[y] = a[y] + a[x];
60                         a[y]%=mod;
61                         ask = dp[y];
62                     }
63                 }ask = 0;
64                 for(i = 1;i <= n;i++)
65                 {
66                     ask = ask + dp[i];
67                     ask %= mod;
68                 }
69                 printf("%lld\n",ask);
70         }
71         return 0;
72 }
 
时间: 2024-08-07 12:24:45

1804: 有向无环图的相关文章

CSU 1804: 有向无环图 拓扑排序 图论

1804: 有向无环图 Submit Page   Summary   Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 716     Solved: 298 Description Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,-,n 编号. 设 count(x,y) 表示点 x 到点 y 不同的路径数量(规定 count(x,x)=0

CSU 1804 - 有向无环图 - [树形DP]

题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,-,n 编号. 设 count(x,y) 表示点 x 到点 y 不同的路径数量(规定 count(x,x)=0),Bobo 想知道 除以 (10 9+7) 的余数. 其中,a i,b j 是给定的数列. Input 输入包含不超过 15 组

CSU 1804: 有向无环图(拓扑排序)

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1804 题意:…… 思路:对于某条路径,在遍历到某个点的时候,之前遍历过的点都可以到达它,因此在这个时候对答案的贡献就是∑(a1 + a2 + a3 + ... + ai) * bv,其中a是之前遍历到的点,v是当前遍历的点. 这样想之后就很简单了.类似于前缀和,每次遍历到一个v点,就把a[u]加给a[v],然后像平时的拓扑排序做就行了. 1 #include <bits/stdc++.h>

csu oj 1804: 有向无环图 (dfs回溯)

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1804 中文题意就不说了. dfs从底到根回溯即可,看代码应该能清楚. 1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include <algorithm> 3 #include <iostream> 4 #include <cstdlib> 5 #include

有向无环图

1804: 有向无环图 Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 751     Solved: 313 Description Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y 不同的路径数量(规定 count(x,x)=0),Bobo 想知道 除以 (109+7) 的余

【拓扑】【宽搜】CSU 1084 有向无环图 (2016湖南省第十二届大学生计算机程序设计竞赛)

题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1804 题目大意: 一个有向无环图(DAG),有N个点M条有向边(N,M<=105),每个点有两个值ai,bi(ai,bi<=109),count(i,j)表示从i走到j的方案数. 求mod 109+7的值. 题目思路: [拓扑][宽搜] 首先将式子拆开,每个点I走到点J的d[j]一次就加上一次ai,这样一个点被i走到的几次就加上几次ai,相当于count(i,j)*ai,最终只要求

UVA10305 Ordering Tasks(有向无环图排序--toposort) Kahn算法

题目描述:https://vjudge.net/problem/UVA-10305 题目分析: 恨水的题目,只要学了toposort就会做的,大概意思是给你n个变量,m个不等关系表示a<b,问n个数可能的关系;不如举个例子例如n=3表示3个变量我们假如他们是a,b,c现在有两个关系a<b,a<c 那么输出有两种a<b<c或者a<c<b(题目要求输出任意一种); 题目大概就这个意思,那么我们怎么做呢,我们想一想如果把变量看成点,关系看成有向边,那么就得到一个图,这个

图的邻接表表示与无环图的拓扑排序

一.  图的最常用的表示方法是邻接矩阵和邻接表. 1,邻接矩阵 邻接矩阵其实就是一个二维数组,对于每条边<u,v>,我们就令A[u][v] = 1,如果图为有权图,我们也可以令A[u][v]等于该权,这么表示的优点是非常简单,但是它的空间需求很大,如果图是稠密的,邻接矩阵是合适的表示方法,如果图是稀疏的,那这种方法就太浪费空间了,下面给出图的邻接矩阵表示例子. 2 邻接表 邻接表是图的常用储存结构之一.邻接表由表头结点和表结点两部分组成,其中图中每个顶点均对应一个存储在数组中的表头结点.如下图

HDU 3249 Test for job (有向无环图上的最长路,DP)

 解题思路: 求有向无环图上的最长路,简单的动态规划 #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <cmath> #define LL long long using namespace std; const int