HUD2647 Reward_反向建图拓扑排序
HDU2647 Reward
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647
题意:老板要发奖金了,有n个人,给你m对数,类似a b,这样的一对数,意思是a的奖金需要比b多,问满足老板的给出这些关系最少需要多少钱,如果无法满足老板的条件就直接输出-1.
很明显如果三对数,<a,b><b,c><c,a>存在矛盾,ra>rb,rb>rc,rc>ra(r前缀表示奖金),是不可能的,也就是说这个图存在环的情况下,无法满足老板的条件。
有向图判圈,我们想到可以用并查集,但是对于1-n个数两两判圈,面对题目给的数据量肯定是会超时的,通过这道题,我也学习了一个新姿势,接下来介绍一下。
首先这道题后续节点的奖金数决定了前续节点,所以我们需要反向建图,保证一个点的所有的后续节点都知道奖金值得时候才给这个点赋值奖金数。接下来,我们发现对于拓扑排序的我们记录每一个点的出度。当一个点的出度通过剪边消耗为0的时候,我们把压入队列,最后我们会遍历所有的点。试问我们可不可以这样理解拓扑排序中出现环的情况,我们把环缩成一个点,在一个环上的点无法用拓扑排序比较出大小,在拓扑排序的时候的时候我们实际上是把一个环作为一个整体,与其他非环部分拓扑排序。所以我们排序完以后,我们不会遍历所有的点,因为对于一个环,我们遍历了他的一个点。而其余的点我们并未遍历。这样我们可以通过遍历的点数判断是否出现环,还有就是对于一个点在剪边的过程中我们要维护他奖金的最大值。下面是代码……
//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=+;
using namespace std;
typedef long long L;
vector<int>q;
vector<int>p[N];
int in[N];
int main(){
ios::sync_with_stdio(false);cin.tie();
int n,m;
while(cin>>n>>m){
q.clear();
memset(in,,sizeof(in));
for(int i=;i<=n;i++) p[i].clear();
q.clear();
int reward[N];
for(int i=;i<=n;i++) reward[i]=;
for(int i=;i<m;i++){
int a,b;
cin>>a>>b;
p[b].push_back(a);//反向建图
in[a]++;//记录出度
}
int ct=,ans=;
for(int i=;i<=n;i++) if(!in[i]) {q.push_back(i);ans+=reward[i];}
while(q.size()!=){
int t=q.back();q.pop_back();
ct++;
for(int i=;i<p[t].size();i++){
int x=p[t][i];
if(--in[x]==){
q.push_back(x);
reward[x]=max(reward[x],reward[t]+);//维护一个点奖金的最大值
ans+=reward[x];//出度减少为0的时候,ans+=reward[i]
}
else{
reward[x]=max(reward[x],reward[t]+);//维护一个点奖金的最大值
}
}
}
if(ct!=n){//判断是否遍历了所有的点
cout<<-<<endl;
}
else cout<<ans<<endl;
}
return ;
}
HUD2647 Reward_反向建图拓扑排序的更多相关文章
- HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)
逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...
- POJ3687——Labeling Balls(反向建图+拓扑排序)
Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...
- 逃生 HDU 4857(反向建图 + 拓扑排序)
逃生 链接 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必 ...
- BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序
BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序 Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息 ...
- hdu 4857 逆向建图+拓扑排序 ***
题意:糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行.现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有 ...
- poj 3683 2-sat建图+拓扑排序输出结果
发现建图的方法各有不同,前面一题连边和这一题连边建图的点就不同,感觉这题的建图方案更好. 题意:给出每个婚礼的2个主持时间,每个婚礼的可能能会冲突,输出方案. 思路:n个婚礼,2*n个点,每组点是对称 ...
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
- [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]
题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...
- BZOJ 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)
题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...
随机推荐
- python—networkx:在一张图中画出多个子图
通过plt.subplot能够在一张图中画出多个子图 #coding: utf-8 #!/usr/bin/env python """ Draw a graph with ...
- MySQL Fabric部署
架构描写叙述: 一台主机上安装4个MySQL 服务,当中一个MySQL服务用于存储MySQL Fabric后台数据:另外3个MySQL服务用于主从架构測试.一个主+两个从. 第一部分:二进制方式安装M ...
- linux 下面压缩,解压.rar文件以及rar,unrar实例
http://www.rarlab.com/download.htm [root@bass src]# wget http://www.rarlab.com/rar/rarlinux-x64-5.4. ...
- 实战 Lucene,第 1 部分: 初识 Lucene (zhuan)
http://www.ibm.com/developerworks/cn/Java/j-lo-lucene1/ ******************************************** ...
- [C++]怎么将.h和.cpp文件分别放在不同的目录
相关资料: http://blog.csdn.net/onafioo/article/details/8775501 具体操作: 1.找到.h文件目录.2.将所以的.h文件剪切到“include”目录 ...
- CSS学习笔记(4)--选择器(w3school)
CSS3 选择器 在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素. "CSS" 列指示该属性是在哪个 CSS 版本中定义的.(CSS1.CSS2 还是 CSS3.) ...
- /usr/bin/ld: cannot find -lc错误原因及解决方法
问题解决 我在执行如下命令的时候,出现了错误. gcc -o main main.c -static -L. –lmylib Linux环境下gcc静态编译/usr/bin/ld: cannot fi ...
- Linux samba 服务的配置
今天有个学生问我 samba 服务怎么配置,所以晚上特意研究一下怎么配置这个服务. 过程如下: sudo apt-get install samba samba-common // 安装 samba ...
- 为什么对一些矩阵做PCA得到的矩阵少一行?
很多时候会出现把一个N*M的矩阵做pca(对M降维)之后却得到一个M*(M-1)矩阵这样的结果.之前都是数学推导得到这个结论,但是, 今天看到一个很形象的解释: Consider what PCA d ...
- API - 使用数据仓库 - 基础篇
数据仓库是集成在Spider Studio中的一个重要功能, 利用它可以非常方便的保存采集到的数据, 然后导出或者在其他脚本中再利用. 数据仓库的全部功能都集成在DataManager这个静态类里面, ...