HDU 2647:Reward(拓扑排序+队列)
Reward
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12918    Accepted Submission(s): 4129
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.
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.
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.
Sample Input
2 1
1 2
2 2
1 2
2 1
Sample Output
1777
-1
题意
老板给员工发工资,n个员工,m中工资关系,每次输入两个人,要求前面的人的工资比后面高。员工的最低工资是888,老板一共需要支付多少工资?如果支付工资是不能满足所有人的要求,输出-1
思路
反向建图,让工资低的那个人的顶点指向工资高的人。然后拓扑排序判断是否有环,有环输出-1 。没有环就将图分层,每一层工资增加1 ,最后输出所需发的工资。
注意建图时用vector,二维数组会爆内存
AC代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define l long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e4+10;
using namespace std;
int n,m;
vector<int> v[maxn];
int vis[maxn];
int money[maxn];
bool toposort()
{
	int ans=0;
	queue<int>que;
	for(int i=1;i<=n;i++)
	{
		// 把刚开始入度为0的点放入
		if(!vis[i])
			que.push(i);
	}
	while(!que.empty())
	{
		int res=que.front();
		que.pop();
		// 每次pop出去的点都是入度为0的点,统计这些点的个数
		ans++;
		for(int i=0;i<v[res].size();i++)
		{
			vis[v[res][i]]--;
			if(vis[v[res][i]]==0)
			{
				// 将入度为0的点加入队列
				que.push(v[res][i]);
				// 更新一下后继点的工资,有点难理解,建议画一下图找几组样例试一下
				money[v[res][i]]=max(money[res]+1,money[v[res][i]]);
			}
		}
	}
	if(ans==n)
		return true;
	else
		return false;
}
int main(int argc, char const *argv[])
{
	ios::sync_with_stdio(false);
	int x,y;
	while(cin>>n>>m)
	{
		ms(vis);
		ms(money);
		for(int i=0;i<maxn;i++)
			v[i].clear();
		for(int i=0;i<m;i++)
		{
			cin>>x>>y;
			// 反向建图
			v[y].push_back(x);
			vis[x]++;
		}
		if(!toposort())
			cout<<-1<<endl;
		else
		{
			ll ans=888*n;
			for(int i=1;i<=n;i++)
				ans+=money[i];
			cout<<ans<<endl;
		}
	}
	return 0;
}
 												
											HDU 2647:Reward(拓扑排序+队列)的更多相关文章
- HDU.2647 Reward(拓扑排序 TopSort)
		
HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的 ...
 - ACM:  hdu 2647 Reward -拓扑排序
		
hdu 2647 Reward Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Des ...
 - HDU 2647 Reward (拓扑排序)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意是给你n点m条有向边,叶子点(出度为0)上的值为888,父亲点为888+1,依次计算... ...
 - hdu 2647 Reward(拓扑排序+优先队列)
		
Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he ...
 - hdu 2647 Reward(拓扑排序+反图)
		
题目链接:https://vjudge.net/contest/218427#problem/C 题目大意: 老板要给很多员工发奖金, 但是部分员工有个虚伪心态, 认为自己的奖金必须比某些人高才心理平 ...
 - HDU 2647 逆向拓扑排序
		
令每一个员工都有一个自己的等级level[i] , 员工等级越高,那么工资越高,为了使发的钱尽可能少,所以每一级只增加一单位的钱 输入a b表示a等级高于b,那么我们反向添加边,令b—>a那么i ...
 - 题解报告:hdu 2647 Reward(拓扑排序)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion's uncle is a boss ...
 - HDU 2647 Reward【反向拓扑排序】
		
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
 - HDU 2647 Reward(拓扑排序+判断环+分层)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题目大意:要给n个人发工资,告诉你m个关系,给出m行每行a b,表示b的工资小于a的工资,最低工 ...
 
随机推荐
- scrapy 也能爬取妹子图?
			
目录 前言 Media Pipeline 启用Media Pipeline 使用 ImgPipeline 抓取妹子图 瞎比比前言 我们在抓取数据的过程中,除了要抓取文本数据之外,当然也会有抓取图片的需 ...
 - vmware 安装ubuntu
			
点击自定义硬件 即将完毕 下面就是安装啦
 - Lua面向对象 --- 多态
			
多态,简单的理解就是事物的多种形态.专业的术语说就是:同一个实现接口,使用不同的实例而执行不同的操作. 工程结构: BaseRoom.lua: BaseRoom = {} function BaseR ...
 - 监督学习--k近邻算法
			
2017-07-20 15:18:25 k近邻(k-Nearest Neighbour, 简称kNN)学习是一种常用的监督学习方法,其工作机制非常简单,对某个给定的测试样本,基于某种距离度量找出训练集 ...
 - Apache配置文件httpd.conf细说
			
1.httpd.conf文件位于apache安装目录/conf下2.Listen 88表示监听端口88 此处可以连续写多个端口监听如下: Listen 88 Listen 809 3.目录配置如下: ...
 - ubuntu server 无线网卡的处理
			
1) iwconfig 确定一下接口的名称 2) 编辑 /etc/network/interfaces 加入下面的代码 auto wlan0 iface wlan0 inet dhcp wpa-ssi ...
 - 转发一篇分析LinQ是什么?
			
LINQ(发音:Link)是语言级集成查询(Language INtegrated Query) ?LINQ是一种用来进行数据访问的编程模型,使得.NET语言可以直接支持数据查询 ?LINQ的目标是降 ...
 - 关于"架构"
			
杨光辉说,在构架系统的早期可能不会更多地考虑架构,主要是在做技术选型,首先是编程语言的选择.对于编程语言选择,当前主流编程语言有很多,有面向对象语言.传统式语言等.做这个选择主要根据人员知识储备,包括 ...
 - js获取表格视图所选行号的ids
			
实例化数组 遍历所选行push到数组中 将数组join转换为以,分割的字符串 /*获取指定id的datagrid的表格视图的选择的ids*/ function getDataGridSelectRow ...
 - python-day34--进程补充
			
一.进程补充: 1,生产者消费者模型: 两类角色,一类负责生产数据,另外那类负责数据 生产完放到共享空间,另外那类到空间取数据进行处理 好处: 生产数据的同时可以进行数据的处理,不用等(并发效果) 问 ...