HDU-2647 Reward ,逆拓排。
Reward
发工资,以前看过这题,做没做忘了(应该是没做)。
很明显的拓排。但数据范围这么大,吓得我当时就不敢动手。后来找题解发现还是相当于两层循环(are you kidding me?)当时卡在了不造怎么分层累加,比如4个人,2个关系,1>2,3>4。那么1,3在同一层,2,4在同一层。
题意:年终奖金最低888,但员工间有要求,n个员工,m个要求,m行每行两个数代表前一个人的工资要多于后一个人的。为了满足所有员工的要求,问boss最少需要多少money。
思路:二维数组爆内存,看到几个MLE的让我笑会。用vector存图,把前一个存进后一个里,前一个的度加一。q[v].push_back(u),好吧,比赛的时候,没想到要这样的。然后把所有度为0的放进队列里面。其实这就在计算第一层了。把与这些点相连的点的度全部减一,再把度变为0的点又加进队列里(第二层的)。重复操作。。判环可以把整个过程度为0的数量计算出来,再与n比较,也可以在最终队列结束后一层循环判断是否有度大于0的点,因为正常情况下所有的点都会进入队列一次,有环的话则度不会减为0也不会进入队列。
const int N=1e4+10;
vector<int>q[N];
queue<int>que;
int n,m,du[N],now;
void init()
{
now=888;//第0层的工资即初始工资;
for(int i=0; i<=n; i++) q[i].clear();
memset(du,0,sizeof(du));
while(!que.empty()) que.pop();
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
int u,v;
while(m--)
{
scanf("%d%d",&u,&v);
q[v].push_back(u);//逆拓排;
du[u]++;
}
int cnt=0;
for(int i=1; i<=n; i++)
if(!du[i])
{
que.push(i);
cnt++;
}
int ans=0;
while(!que.empty())
{
int size=que.size();
while(size--)//按层累加
{
int v=que.front();
que.pop();
ans+=now;
for(int i=0; i<q[v].size(); i++)
{
int u=q[v][i];
du[u]--;
if(!du[u])
{
que.push(u);
cnt++;
}
}
}
now++;
}
int f=0;
for(int i=1;i<=n&&!f;i++)
if(du[i]) f=1;
if(f) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}
这样没超时我是比较奇怪的,拓排运用的并不是很多,也不是很熟练,这样也算加深对知识点的理解运用吧。
HDU-2647 Reward ,逆拓排。的更多相关文章
- ACM: hdu 2647 Reward -拓扑排序
hdu 2647 Reward Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
- HDU.2647 Reward(拓扑排序 TopSort)
HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...
- 题解报告:hdu 2647 Reward(拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion's uncle is a boss ...
- hdu 2647 Reward
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2647 Reward Description Dandelion's uncle is a boss o ...
- HDU 2647 Reward (拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意是给你n点m条有向边,叶子点(出度为0)上的值为888,父亲点为888+1,依次计算... ...
- HDU 2647 Reward(拓扑排序+判断环+分层)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题目大意:要给n个人发工资,告诉你m个关系,给出m行每行a b,表示b的工资小于a的工资,最低工 ...
- HDU 2647 Reward(图论-拓扑排序)
Reward Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is comin ...
- hdu 2647 Reward(拓扑排序,反着来)
Reward Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
- HDU 2647 Reward 【拓扑排序反向建图+队列】
题目 Reward Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to d ...
随机推荐
- solr查询优化【转】filtercache
solr查询优化(实践了一下效果比较明显) 什么是filtercache? solr应用中为了提高查询速度有可以利用几种cache来优化查询速度,分别是fieldValueCache,queryRes ...
- AJPFX谈Java 性能优化之基本类型 vs 引用类型
★名词定义 先明确一下什么是“基本类型”,什么是“引用类型”. 简单地说,所谓基本类型就是 Java 语言中如下的8种内置类型: booleancharbyteshortintlongfloatdou ...
- SQL异常为"当IDENTITY_INSERT设置为OFF时" 的解决
误删数据库时,可以利用insert插入删除的数据,但是有时表可能有自增字段如id.这是插入数据如果包含自增字段就会出现错误,提示"IDENTITY_INSERT设置为OFF,插入失败&quo ...
- Android原生系统API自带dp、px、sp单位转换
Android系统中自带的Api中可以使用TypedValue进行单位转换 1,调用系统api转换单位 // 获得转换后的px值 float pxDimension = TypedValue.appl ...
- anzhuaggeoip
1.因启动geoip模块,需要先安装GeoIP # wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz # tar xv ...
- Redis学习笔记(六)有序集合进阶
1.基础操作 ZCARD(获取成员数量) ZINCRBY key_name num member(将member的分数加num) ZCOUNT key_name min max(获取分数在min与ma ...
- 项目中非常有用并且常见的ES6语法
今天闲着无事,梳理下ES6常见的语法知识点:除此之外的知识点自行细化和梳理! <!DOCTYPE html> <html> <head> <meta char ...
- NSMutableDictionary 排序问题
NSMutableDictionary 默认情况下是按字母的顺序进行排序的 (a-z)的默认排序如何自定义排序呢? 第一种,利用数组的sortedArrayUsingComparator调用 NSCo ...
- Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(一)
这个地方的生成需要用到三个文件,generatorConfig.xml.mybatis-generator-core-1.3.1.jar和mysql-connector-java-5.1.29.jar ...
- Python 基础语法学习(第一讲)---类的使用
[写在前面]:其实自学python有一段时间了,但是一直没想起来要写博客来记录自己的学习,今天才感觉要写点什么让自己学的更扎实一点,所以从今天开始更新python自学系列,希望看见文章的大佬们可以指点 ...