第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题
Input
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 - 有向无环图 )(拓扑排序+思维)好题相关推荐
- 蓝桥杯2021年第十二届省赛-杨辉三角形
蓝桥杯2021年第十二届省赛真题-杨辉三角形 - C语言网 (dotcpp.com)https://www.dotcpp.com/oj/problem2610.html 参考: 2021第十二届蓝桥杯 ...
- 【蓝桥杯单片机第十二届国赛真题】
[蓝桥杯单片机第十二届国赛真题] 文章目录 [蓝桥杯单片机第十二届国赛真题] 前言 一.真题 二.源码 前言 有幸进入国赛,为自己大学最后一个比赛画上完满的句号^@^ 下面为蓝桥杯单片机第十二届国赛程 ...
- 第十二届省赛嵌入式设计与开发《停车计费系统》
前言 刷了几套蓝桥杯省赛程序题目,心有所感,故写下文章记录一下,本篇文章记录的是第十二届省赛嵌入式设计与开发程序设计题目. 这套题的考察重点和难点在STM32的串口和字符串的处理,难点在于细节方面,对 ...
- 突击蓝桥杯嵌入式(十二)——第十二届省赛第一场真题 停车场
突击蓝桥杯嵌入式(十二)--第十二届省赛第一场真题 停车场 一.题干 二.题目解析 所需: PA7 PWM LED(锁存器) 串口9600 LCD 按键4个,整体难在逻辑,我们先配置好硬件,进入工程 ...
- 【蓝桥杯第十二届省赛】
[蓝桥杯第十二届省赛] #include "reg52.h" #include "onewire.h" #include "iic.h"/* ...
- 48. 数据结构笔记之四十八的有向无环图的应用关键路径
48. 数据结构笔记之四十八的有向无环图的应用关键路径 "富贵不淫贫贱乐 , 男儿到此是豪雄.-- 程颢" 来看下有向无环图的另一个应用关键路径. 1. 关键路径 与AOV-网相 ...
- 蓝桥杯嵌入式第十二届省赛真题
第十二届蓝桥杯嵌入式-停车计费 文章目录 第十二届蓝桥杯嵌入式-停车计费 1.题目分析 2.项目结构 2.1停车部分整体流程 2.2串口数据解析流程 2.3细节部分 3.代码结构 3.1停车部分 3. ...
- 【蓝桥杯省赛】冲刺练习题【第十二届省赛2套题】倒计时【02】天(准考证组委会已下发,请查询)
- 蓝桥杯第十二届省赛题解
赛后才知道计算公式是256乘1024乘1024乘8除以32,泪崩== #include<bits/stdc++.h> using namespace std; int num[10]; b ...
最新文章
- samtools 检测bam文件的完整度
- shutdown thread.java_ShutdownHook- Java 优雅停机解决方案
- 安智armeabi 和 armeabi-v7a 的库文件增加法则
- redis实战之使用redis实现排行榜
- RHEL6 Kickstart 无人值守安装
- request payload怎么发_做了一个个人博客,但不知道怎么介绍
- DevExpress GridControl Gridview RepositoryItemCheckEdit复选框及获取选择行数据
- 人工智能_TensorFlow工作笔记003---在pycharm中安装TensorFlow
- electron ajax路径,electron 打包用file协议的ajax请求路径问题
- 模板题——单链表双链表,数组模拟的栈和队列,单调栈和单调队列
- 学Java编程可以做什么?发展方向有哪些?
- @Trasactional 事务解读
- Teardrop代码编程,创建虚假包
- c 语言构造函数的实验报告,c上机实验报告_相关文章专题_写写帮文库
- win10镜像无法再此计算机上运行,Win10安装镜像提示运行此工具时出现问题如何解决...
- 微信公众号第三方平台开发笔记--02获取component_verify_ticket
- 熟悉计算机信息处理的基础知识,信息处理技术员学习指导—考试内容
- 怎么样让自己的博客被谷歌和百度收录!
- Cisco ISO 下载地址汇总
- 运维人员常用到的 11 款服务器监控工具
热门文章
- 我的处女作《设计模式之禅》——前言
- 网络上各台计算机语言,人类使用语言来交流,同样,网络上的各台计算机之间也用某种语言交换信息,这样的语言通常指()。...
- java项目中外接扫描仪无法使用_java – 扫描仪行不可用错误
- python英文字符串排序_Python根据内嵌的数字将字符串排序(sort by numbers embedded in strings)...
- 皖西学院计算机证书,下半年皖西学院计算机等级考试报名时间
- 1t硬盘怎么分区最好_这下尴尬了,电脑硬盘分区常见误区,移动硬盘分区方法...
- C语言数字3转变字符 3 程序,大学c语言知识点总结
- 8086除法指令DIV,IDIV
- python岗位 上海_上海黑马Python24期,平均薪资10150元,16个工作日就业率70.73%
- leetcode 51. N 皇后 思考分析