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连边,做一遍后缀数组,两 ...
随机推荐
- 改动app的默认设置(包含改动默认launcher)
1.改为自己的launcher ComponentName component = new ComponentName( context.getPackageName(), MainActivity. ...
- 17. Subsets【medium】
Given a set of distinct integers, return all possible subsets. Notice Elements in a subset must be i ...
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现抽象类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
- js基本知识1
Javascript 作用 1. 网页特效 2. 用户交互 3. 表单验证 Js 就是可以用来控制 结构 和 样式 . 1.2 体验js 认识常用的三个输出语句. 都属于 js 内置对象 . 大家买手 ...
- jvm默认垃圾收集器
jdk1.7 默认垃圾收集器Parallel Scavenge(新生代)+Parallel Old(老年代) jdk1.8 默认垃圾收集器Parallel Scavenge(新生代)+Parallel ...
- js delete
在开始之前,先让我们看一段代码 >>> var sum = function(a, b) {return a + b;} >>> var add = sum; &g ...
- Windows Phone 修改系统定义的资源颜色
[问题的背景] 相信有些经验的WP研发同学都会遇到下面的问题: 系统控件以及WPToolkit中大量使用了PhoneAccentBrush这个画刷(这个画刷定义的是系统的强调色,即用户选择的主题颜色) ...
- php服务器环境变量
可以把一些配置写到apache或nginx的配置里,然后在代码里判断环境变量来实现开发环境和线上环境的切换. 比如在本地可以 SetEnv APP_ENV local线上则 SetEnv APP_EN ...
- AM335x 添加 HUAWEI MU609 Mini PCIe Module,并用pppd 启动相关设备
kernel 的配置 kernel 3.2.0 make menuconfig Device Drivers ---> [*] USB support ---> <*> USB ...
- 使用模板方法模式简化JDBC操作
在使用JDBC时,会重复的写很多重复的代码,例如 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; S ...