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_反向建图拓扑排序的更多相关文章

  1. HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)

    逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...

  2. POJ3687——Labeling Balls(反向建图+拓扑排序)

    Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...

  3. 逃生 HDU 4857(反向建图 + 拓扑排序)

    逃生 链接 Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必 ...

  4. BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序

    BZOJ_4383_[POI2015]Pustynia_线段树优化建图+拓扑排序 Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息 ...

  5. hdu 4857 逆向建图+拓扑排序 ***

    题意:糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行.现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有 ...

  6. poj 3683 2-sat建图+拓扑排序输出结果

    发现建图的方法各有不同,前面一题连边和这一题连边建图的点就不同,感觉这题的建图方案更好. 题意:给出每个婚礼的2个主持时间,每个婚礼的可能能会冲突,输出方案. 思路:n个婚礼,2*n个点,每组点是对称 ...

  7. 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)

    题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...

  8. [POI2015][bzoj4383] Pustynia [线段树优化建图+拓扑排序]

    题面 bzoj权限题传送门 luogu传送门 思路 首先,这个题目显然可以从所有小的点往大的连边,然后如果没环就一定可行,从起点(入读为0)开始构造就好了 但是问题来了,如果每个都连的话,本题中边数是 ...

  9. BZOJ 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)

    题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...

随机推荐

  1. initWithNibName和viewDidLoad执行顺序

    转自:http://justsee.iteye.com/blog/1626231 众所周知,IB在加载nib的过程中存在着一些undocument行为,有的行为确实是不可理喻的,因此程序员对IB产生了 ...

  2. Ownerdrawn ComboBox

    [ToolboxBitmap(typeof(ComboBox))] class ComboBoxEx : ComboBox { public ComboBoxEx() { this.DrawMode ...

  3. Linux下编译C++程序遇到错误:undefined reference to `*::*

    “undefined reference to”的意思是,该函数未定义. 如果使用的是g++,有以下检查方案: 如果提示未定义的函数是某个库的函数.检查库是否已经安装,并在编译命令中采用-l和-L参数 ...

  4. python操作word【简单封装】

    #!/usr/bin/env python # -*- coding: utf-8 -*- import win32com.client import os #-------------------- ...

  5. Soursight Insight 使用小结

    1.Soursight Insight中添加自需要的文件过滤器: options->document options ->add type document type name:scatt ...

  6. MySQL数据库运维的五大指标

    如何评价一个公司数据库运维水平的高低?用什么来进行横向与纵向对比?自动化平台建设的目标是什么?必须有相应的指标体系来指导,此指标体系必须满足以下条件: • 可以用数字来测算和衡量 • 最终指标,而不是 ...

  7. jq 按回车键 登陆

    $("body").keydown(function(e) {             if (event.which == "13") {//keyCode= ...

  8. SQL里3个表的连接查询

    两种:1.select * from 表1,表2,表3 where 表1.字段=表2.字段 and 表1.字段=表3.字段这种效率比较低 结构简单数据量小可以采用2.select * from 表1 ...

  9. EJB类库存在于Java的哪个版本中?(选择1项)。

    A. J2SE B. J2EE C. J2ME D. J2NE 解答:B

  10. wifi的web 认证。

    wifi的web 认证.wifidog+authpuppy+php 或者Wiwiz Auth API