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 组数据。
每组数据的第一行包含两个整数 n,m (1≤n,m≤10 5).
接下来 n 行的第 i 行包含两个整数 a i,b i (0≤a i,b i≤10 9).
最后 m 行的第 i 行包含两个整数 u i,v i,代表一条从点 u i 到 v i 的边 (1≤u i,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

Hint

思路:

由有向图拓扑序的性质可以知道,拓扑序在后的节点是没有指向拓扑序在前的节点。

那么我们在对整个图进行拓扑的时候,把起始点 x 的a[x] 值 附加到 这个边的终点 y 的a[y] 值上。

并且对于每一个边,我们维护一个 long long 类型的 答案 ans,ans+= a[x]*b[y]  (  边 是 x ~> y )

那么这里就介绍刚刚我们为什么要附加数值a[x] 到a[y]上。

如果由三个点  x y z ,由如下的连接关系 x ~> y ~> z 那么x到y的边我们会算一次对答案的贡献值,y到z的边我们也会算一次。

还有一个x到z的边,我们仍然需要算。因为x可以到达z,那么如果我们在拓扑的时候把a[y]加上a[x] 时, 我们在算 b到z 的边的时候就顺便的加上了a到z的边。

因为x 的拓扑优先级比y高,并且x可以到达y,那么x就可以到达y能到达的所有边,那么就解释了这样做的原因。

这样做的时间复杂度就会转化为 O ( N )

主要是理解后就很好写代码,可以自己动手画图理解一下上面 讲的内容。

实现细节见ac代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=100010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
std::vector<int> son[maxn];
const ll mod=1e9+7ll;
ll ans=0ll;
ll a[maxn];
ll b[maxn];
ll num[maxn];
int du[maxn];
int main()
{// freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
    gbtb;int n,m;while(cin>>n>>m){repd(i,1,n){son[i].clear();}MS0(du);MS0(num);repd(i,1,n){cin>>a[i]>>b[i];}int x,y;repd(i,1,m){cin>>x>>y;son[x].push_back(y);du[y]++;}queue<int> q;repd(i,1,n){if(!du[i]){q.push(i);}}ans=0ll;while(q.size()){int temp=q.front();q.pop();for(auto x:son[temp]){ans=(ans+(a[temp]*b[x])%mod+mod)%mod;a[x]+=a[temp];a[x]=(a[x]+mod)%mod;du[x]--;if(!du[x]){q.push(x);}}}cout<<ans<<endl;}return 0;
}inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}}
}

转载于:https://www.cnblogs.com/qieqiemin/p/10679978.html

第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题相关推荐

  1. 蓝桥杯2021年第十二届省赛-杨辉三角形

    蓝桥杯2021年第十二届省赛真题-杨辉三角形 - C语言网 (dotcpp.com)https://www.dotcpp.com/oj/problem2610.html 参考: 2021第十二届蓝桥杯 ...

  2. 【蓝桥杯单片机第十二届国赛真题】

    [蓝桥杯单片机第十二届国赛真题] 文章目录 [蓝桥杯单片机第十二届国赛真题] 前言 一.真题 二.源码 前言 有幸进入国赛,为自己大学最后一个比赛画上完满的句号^@^ 下面为蓝桥杯单片机第十二届国赛程 ...

  3. 第十二届省赛嵌入式设计与开发《停车计费系统》

    前言 刷了几套蓝桥杯省赛程序题目,心有所感,故写下文章记录一下,本篇文章记录的是第十二届省赛嵌入式设计与开发程序设计题目. 这套题的考察重点和难点在STM32的串口和字符串的处理,难点在于细节方面,对 ...

  4. 突击蓝桥杯嵌入式(十二)——第十二届省赛第一场真题 停车场

    突击蓝桥杯嵌入式(十二)--第十二届省赛第一场真题 停车场 一.题干 二.题目解析 所需: PA7 PWM LED(锁存器) 串口9600 LCD 按键4个,整体难在逻辑,我们先配置好硬件,进入工程 ...

  5. 【蓝桥杯第十二届省赛】

    [蓝桥杯第十二届省赛] #include "reg52.h" #include "onewire.h" #include "iic.h"/* ...

  6. 48. 数据结构笔记之四十八的有向无环图的应用关键路径

    48. 数据结构笔记之四十八的有向无环图的应用关键路径 "富贵不淫贫贱乐 , 男儿到此是豪雄.-- 程颢" 来看下有向无环图的另一个应用关键路径. 1.  关键路径 与AOV-网相 ...

  7. 蓝桥杯嵌入式第十二届省赛真题

    第十二届蓝桥杯嵌入式-停车计费 文章目录 第十二届蓝桥杯嵌入式-停车计费 1.题目分析 2.项目结构 2.1停车部分整体流程 2.2串口数据解析流程 2.3细节部分 3.代码结构 3.1停车部分 3. ...

  8. 【蓝桥杯省赛】冲刺练习题【第十二届省赛2套题】倒计时【02】天(准考证组委会已下发,请查询)

      

  9. 蓝桥杯第十二届省赛题解

    赛后才知道计算公式是256乘1024乘1024乘8除以32,泪崩== #include<bits/stdc++.h> using namespace std; int num[10]; b ...

最新文章

  1. samtools 检测bam文件的完整度
  2. shutdown thread.java_ShutdownHook- Java 优雅停机解决方案
  3. 安智armeabi 和 armeabi-v7a 的库文件增加法则
  4. redis实战之使用redis实现排行榜
  5. RHEL6   Kickstart 无人值守安装
  6. request payload怎么发_做了一个个人博客,但不知道怎么介绍
  7. DevExpress GridControl Gridview RepositoryItemCheckEdit复选框及获取选择行数据
  8. 人工智能_TensorFlow工作笔记003---在pycharm中安装TensorFlow
  9. electron ajax路径,electron 打包用file协议的ajax请求路径问题
  10. 模板题——单链表双链表,数组模拟的栈和队列,单调栈和单调队列
  11. 学Java编程可以做什么?发展方向有哪些?
  12. @Trasactional 事务解读
  13. Teardrop代码编程,创建虚假包
  14. c 语言构造函数的实验报告,c上机实验报告_相关文章专题_写写帮文库
  15. win10镜像无法再此计算机上运行,Win10安装镜像提示运行此工具时出现问题如何解决...
  16. 微信公众号第三方平台开发笔记--02获取component_verify_ticket
  17. 熟悉计算机信息处理的基础知识,信息处理技术员学习指导—考试内容
  18. 怎么样让自己的博客被谷歌和百度收录!
  19. Cisco ISO 下载地址汇总
  20. 运维人员常用到的 11 款服务器监控工具

热门文章

  1. 我的处女作《设计模式之禅》——前言
  2. 网络上各台计算机语言,人类使用语言来交流,同样,网络上的各台计算机之间也用某种语言交换信息,这样的语言通常指()。...
  3. java项目中外接扫描仪无法使用_java – 扫描仪行不可用错误
  4. python英文字符串排序_Python根据内嵌的数字将字符串排序(sort by numbers embedded in strings)...
  5. 皖西学院计算机证书,下半年皖西学院计算机等级考试报名时间
  6. 1t硬盘怎么分区最好_这下尴尬了,电脑硬盘分区常见误区,移动硬盘分区方法...
  7. C语言数字3转变字符 3 程序,大学c语言知识点总结
  8. 8086除法指令DIV,IDIV
  9. python岗位 上海_上海黑马Python24期,平均薪资10150元,16个工作日就业率70.73%
  10. leetcode 51. N 皇后 思考分析