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 ,逆拓排。的更多相关文章

  1. ACM: hdu 2647 Reward -拓扑排序

    hdu 2647 Reward Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Des ...

  2. HDU.2647 Reward(拓扑排序 TopSort)

    HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...

  3. 题解报告:hdu 2647 Reward(拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion's uncle is a boss ...

  4. hdu 2647 Reward

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2647 Reward Description Dandelion's uncle is a boss o ...

  5. HDU 2647 Reward (拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意是给你n点m条有向边,叶子点(出度为0)上的值为888,父亲点为888+1,依次计算... ...

  6. HDU 2647 Reward(拓扑排序+判断环+分层)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题目大意:要给n个人发工资,告诉你m个关系,给出m行每行a b,表示b的工资小于a的工资,最低工 ...

  7. HDU 2647 Reward(图论-拓扑排序)

    Reward Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is comin ...

  8. hdu 2647 Reward(拓扑排序,反着来)

    Reward Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  9. HDU 2647 Reward 【拓扑排序反向建图+队列】

    题目 Reward Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to d ...

随机推荐

  1. 转 sql 查出一张表中重复的所有记录数据

    select * from DB_PATCH awhere lower(a.db_name) in (select lower(db_name) from DB_PATCH group by lowe ...

  2. 通用maper无法获取实体类com.qmtt.model.PhWxUser对应的表名问题

    spring boot在采用了热加载后,可能会出现“无法获取实体类com.qmtt.model.PhWxUser对应的表名!”的异常, 解决办法 在resources新建一个文件夹META-INF,新 ...

  3. [转]Android专家级别的面试总结

    Android专家级别的面试总结 2017年02月15日 16:56:28 阅读数:1225 1.. 自定义View流程 onMeasure, onLayout, onDraw, 采用深度优先,因为必 ...

  4. 001.JS特效

    一.Js实现单行文本的滚动 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  5. 自动创建xml文档

    自动创建xml文档 import xml.etree.ElementTree as ET print(dir(ET)) #ET里面有Element方法 root = ET.Element(" ...

  6. 洛谷P2774 方格取数问题(最小割)

    题意 $n \times m$的矩阵,不能取相邻的元素,问最大能取多少 Sol 首先补集转化一下:最大权值 = sum - 使图不连通的最小权值 进行黑白染色 从S向黑点连权值为点权的边 从白点向T连 ...

  7. ES-Apache Lucene

    前言 在介绍Lucene之前,我们来了解相关的历史. 有必要了解的Apache Apache软件基金会(也就是Apache Software Foundation,简称为ASF)是专门为运作一个开源软 ...

  8. 小程序setData,视图层没有跟新

    如果你完全符合微信介绍的setData使用说明的情况下,发现视图层没有更新,你可以看看我的这种情况. 使用setData的时候,修改的是data中一个对象的值,然后这个对象里面第一层不能含有 numb ...

  9. 使用代码编辑器Sublime Text 3进行前端开发及相关快捷键

    推荐理由: Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比于浮肿沉重的Eclipse, ...

  10. 洛谷 P2680 运输计划

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...