题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647

Problem Description

Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble about how to distribute the rewards.The workers will compare their rewards ,and some one may have demands of the distributing of rewards ,just like a's reward should more than b's.Dandelion's unclue wants to fulfill all the demands, of course ,he wants to use the least money.Every work's reward will be at least 888 , because it's a lucky number.
译文:蒲公英的叔叔是工厂的老板。随着春节的到来,他想分发奖励给他的工人。现在他在分配奖励方面遇到了麻烦。工人们会比较他们的奖励,有些人可能会要求分配奖励,就像a's奖励超过b's一样.Dandelion的不克不及要满足所有的要求,当然他想用最少的钱。每件作品的奖励将至少为888,因为这是一个幸运数字。

Input

One line with two integers n and m ,stands for the number of works and the number of demands .(n<=10000,m<=20000)
then m lines ,each line contains two integers a and b ,stands for a's reward should be more than b's.
译文:一行有两个整数n和m,代表作品数量和需求数量(n <= 10000,m <= 20000),
然后是m行,每行包含两个整数a和b,代表a的奖励应该是比b要多。

Output

For every case ,print the least money dandelion 's uncle needs to distribute .If it's impossible to fulfill all the works' demands ,print -1.
译文:对于每一种情况,打印蒲公英的叔叔需要分发的最少钱。如果不能满足所有作品的需求,则打印-1。

Sample Input

2 1
1 2
2 2
1 2
2 1

Sample Output

1777
-1
解题思路:拓扑排序。因为前者奖励比后者多,又要求用最少的钱来发放奖励,所以只取前者比后者多1的奖励金。如果按之前一般思维来做,即将奖金多的指向奖金少的,在拓扑奖金多的这个节点编号时,势必会影响到之前已经拓扑的节点编号的奖励,因为有可能比它奖励还要多1的节点,这样就不好处理之前已经拓扑的节点编号的奖励。因此,这题需要反过来思考,将奖励少的节点编号指向奖励多的节点编号,这样拓扑奖励少的时候,奖励多的只需比奖励少的多1,最终将所有奖励相加再加上888*n即可。题目给出的数据太大,为避免超时,采用邻接表的做法。对于此题的讲解还可以看看这篇博文:hdu 2647 Reward【拓扑排序】
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=10010;
 4 vector<int> vec[maxn];//邻接表,每个节点保存与它相连的边的另一个端点
 5 queue<int> que;
 6 int n,m,u,v,InDeg[maxn],cnt[maxn];//记录每个节点的入度,cnt记录每个节点该得到的奖励
 7 bool topsort(){
 8     int num=0;
 9     for(int i=1;i<=n;++i)if(!InDeg[i])que.push(i);//预处理,先将入度为0的节点编号入队
10     while(!que.empty()){
11         int now=que.front();que.pop();num++;
12         for(unsigned int i=0;i<vec[now].size();++i){
13             if(--InDeg[vec[now][i]]==0)que.push(vec[now][i]);
14             cnt[vec[now][i]]=cnt[now]+1;//只需比出队元素奖励多1即可
15         }
16     }
17     if(num==n)return true;//满足条件的话返回1
18     else return false;
19 }
20 int main()
21 {
22     while(cin>>n>>m){
23         for(int i=1;i<=n;++i)vec[i].clear();//全部清空
24         memset(InDeg,0,sizeof(InDeg));//全部顶点的度清0
25         memset(cnt,0,sizeof(cnt));
26         while(m--){
27             cin>>u>>v;
28             vec[v].push_back(u);//v指向u
29             InDeg[u]++;//u的入度加1
30         }
31         if(topsort()){
32             int sum=0;
33             for(int i=1;i<=n;++i)sum+=cnt[i];
34             cout<<(sum+888*n)<<endl;
35         }
36         else cout<<"-1"<<endl;
37     }
38     return 0;
39 }

转载于:https://www.cnblogs.com/acgoto/p/9091656.html

题解报告:hdu 2647 Reward(拓扑排序)相关推荐

  1. HDU 2647 Reward (拓扑排序)

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

  2. HDU 2647 Reward 拓扑排序

    http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意: 输入N和M代表N个人和M组数据,M组数据中的A和B代表A的工资要比B的工资高,底薪是(888元), ...

  3. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  4. hdu 4857 逃生 拓扑排序

    逃生 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4857 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只 ...

  5. Hdu - 2647 - Reward

    上题目 Reward Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. HDU 4857 逃生 拓扑排序好题 第一次做CLJ出的题

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

  7. C++解题报告:病毒(virus)——拓扑排序

    题目描述 有一天,小y突然发现自己的计算机感染了一种病毒!还好,小y发现这种病毒很弱,只是会把文档中的所有字母替换成其它字母,但并不改变顺序,也不会增加和删除字母. 现在怎么恢复原来的文档呢!小y很聪 ...

  8. cdoj916-方老师的分身 III 【拓扑排序】

    http://acm.uestc.edu.cn/#/problem/show/916 方老师的分身 III Time Limit: 3000/1000MS (Java/Others)     Memo ...

  9. 【LeetCode】拓扑排序

    [207] Course Schedule 排课问题,n门课排课,有的课程必须在另外一些课程之前上,问能不能排出来顺序. 题解:裸的拓扑排序.参考代码见算法竞赛入门指南这本书. 1 class Sol ...

  10. 题解报告:hihoCoder #1175:拓扑排序·二

    题目链接:https://hihocoder.com/problemset/problem/1175 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学 ...

最新文章

  1. 原创 | CRUD更要知道的Spring事务传播机制
  2. tensorflow 集成开发环境 (IDE)
  3. numa节点_极致性能(1):以NUMA为起点
  4. ORA-01092解决一例
  5. Sublime text3 修改字体和行间距
  6. SpringMVC显示上传文件
  7. Arduino 例程编译错误 error: unknown type name uint_farptr_t did you mean uint_fast8_t
  8. 股市基础知识、主力战法【一】
  9. NetBeans IDE教程
  10. 怎么做二维码?二维码制作的简单方法
  11. 【C语言程序设计】C语言求最小公倍数(详解版)!
  12. Java语言基础(常见对象3(数组排序(冒泡排序、选择排序、直接插入排序、快速排序、归并排序)、Arrays、基本数据类型包装类、Integer类、自动拆箱、自动装箱))
  13. 每日持续签到,累计签到,送积分
  14. 提高期英语学习——第二次罗塞塔
  15. win10系统打开更新服务器失败怎么回事,如何修复Windows Update组件以解决Win10无法自动更新的问题?...
  16. c#窗体编辑个人简历_C#开发工程师完整简历范文
  17. 产品经理在路上之二——用户/行业调研
  18. VMware Photon OS安装配置
  19. Xmemcached failure stand by
  20. 大型ERP系统在线体验账号

热门文章

  1. 2019区块链将走向何方?硅谷知名投资大咖如是说
  2. 群晖系统ftp服务器,群晖对接云服务器ftp
  3. Linux查看mpp数据库地址,linux下打开.mpp文件(微软project)._操作系统_rainysia的专栏-CSDN博客...
  4. php-screw 安装,PHP_SCREW安装
  5. win10系统中如何查看wifi密码
  6. 计算机二级excel设置宏,Excel2013中为宏指定快捷键的方法
  7. 软考答题卡如何填写,这些你都清楚吗?
  8. 业务流程图(TFD)实例
  9. 废弃台式计算机类别,废旧台式电脑(台式机)属于什么垃圾分类?
  10. 零基础CSS入门教程(30)–CSS布局实例