经典问题----拓扑排序(HDU2647)
题目简介:有个工厂的老板给工人发奖金,每人基础都是888,工人们有自己的想法,如:a 工人想要比 b 工人的奖金高,老板想要使花的钱最少 那么就可以 给b 888,给a 889 ,但是如果在此基础上,b也想比a高,那么就不能让他们满意,输出 -1;输入第一行有两个数字,分别为工人数n和要求数m,接下来m行为a员工要求比b员工奖金高。
思路简介:一般拓扑排序:通过记录邻接表入度,先查找入度为0的点输出,如有多个相同值,则随意输出,然后删除该点与下一点的连接,继续查找入度为0的点,直到全部点输出完毕。但由于本题的层数不定,所以应当将入度改为出度,在这里用反向建边优化,如此的时候,我们在拓扑排序的时候第一次找到的点就是没有要求的工人,那么奖励就直接加888,再考虑这一层之后让基本奖励 + 1 ,再拓扑排序便可以了;
基本代码:
#include <iostream>
#include <cmath>
#include <stdio.h>
#include <cstdio>
#include <cstring>
#include<algorithm>
#include<time.h>
#include<math.h>
#include <stdlib.h>
#include <string.h>
#include <stack> using namespace std; #define MAX 10005 struct node
{
int to, next;//to为该边指向的高奖金顶点;next为储存该边的下一条同级边,-1表示没有同级边
}edge[MAX * ]; int head[MAX];//此数组为同级边最靠近低奖金的那条边编号 void add(int a, int b, int tol)
{
edge[tol].to = b;//从奖金小的指向奖金大的
edge[tol].next = head[a];
head[a] = tol;
} int N, M;
int indegree[MAX];//入度
int temp[MAX];//记录临时入度为0点,也就是分析中的在同一层次同一要求奖金额的工人 int topu()
{
int rw = ;//初始奖励
int ans = ;//最后奖励总和
int tol;
for (int i = ; i < N; i += tol)//此为完成所有工人的奖金运算
{
tol = ;//入度为0的点数
int j;
for (j = ; j <= N; j++)//遍历寻找入度为0的点数,即工人数
if (indegree[j] == )
{
temp[tol++] = j;
indegree[j] = -;//取消改点的入度记录
}
if (tol == ) return -;//没有找到就是形成了环,达不到要求
ans += rw*tol; rw++; //这一次入度为0的点数 * 此层的要求奖励额
for (j = ; j<tol; j++)//可达边的删除
{
for (int k = head[temp[j]]; k != -; k = edge[k].next)
{
int v = edge[k].to;
indegree[v]--;
}
}
}
return ans;
} int main()
{
while (~scanf("%d%d", &N, &M))
{
int a, b;
memset(head, -, sizeof(head));
memset(indegree, , sizeof(indegree));
for (int i = ; i < M; i++)
{
scanf("%d%d", &a, &b);
add(b, a, i);//邻接表加边
indegree[a]++;
}
printf("%d\n", topu());
}
return ;
}
经典问题----拓扑排序(HDU2647)的更多相关文章
- 两个很经典的拓扑排序题目POJ3687+HDU1285
		一.题目链接 POJ:http://poj.org/problem?id=3687 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1285 二.思路 这两 ... 
- UVa 10305 (拓扑排序) Ordering Tasks
		题意: 经典的拓扑排序.有n个任务,然后某些任务必须安排在某些任务前面完成,输出一种满足要求的序列. 分析: 拓扑排序用离散里面的话来说就是将偏序关系拓展为全序关系.我们将“小于”这种关系看做一条有向 ... 
- 拓扑排序基础 hdu1258,hdu2647
		由这两题可知拓扑排序是通过“小于”关系加边建图的 hdu2647 /* 拓扑排序的原则是把“小于”看成有向边 此题反向建图即可 并且开num数组来记录每个点的应该得到的权值 */ #include&l ... 
- HDU2647(拓扑排序+反向建图)
		题意不说了,说下思路. 给出的关系是a要求的工资要比b的工资多,因为尽可能的让老板少付钱,那么a的工资就是b的工资+1.能够确定关系为a>b,依据拓扑排序建边的原则是把"小于" ... 
- HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)
		Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ... 
- HDU 1285 经典拓扑排序入门题
		确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ... 
- POJ:1094-Sorting It All Out(拓扑排序经典题型)
		Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Description An ascending sorted sequence ... 
- hdu2647 Reward 拓扑排序
		此题的关键在于分层次,最低一层的人的奖金是888,第二层是888+1 …… 分层可以这样实现.建立反向图.在拓扑排序的时候,第一批入度为0的点就处于第一层,第二批处于第二层 …… 由于是逐个遍历入度为 ... 
- CDOJ   图论专题   A.不是图论   强连通分量+拓扑排序     经典
		题目链接 在其中纠错第一次wa代码 #include <cstdio> #include <cstring> #include <cstdlib> #includ ... 
随机推荐
- STL中set的使用方法
			第一次想认真地学学set,是在我做一题treap的时候产生的念头.(HNOI2004 宠物收养场,洛谷P2286) 嗯,虽然学过一丢丢的treap和splay,但是这编程复杂度貌似有点高…… 无奈翻开 ... 
- Properties类
			简介: Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这 ... 
- css flex布局,小程序flex布局,垂直居中完美解决
			flex弹性布局,很好的解决了垂直居中的问题,上代码: wxml: <view class='container'> <view class='item item1'>item ... 
- YYY0.1YYY
			XXX0.2XXXZZZ目前提供免费下载和自动更新功能,由于自己的时间有限,就我一个开发,后期持续更新在线听歌.mp4转mp3.高音质下载.全球dj网站免费下载功能!ZZZ 
- vue数据修改 但未渲染页面
			1. 普通的 `1.1 this.$set('obj',key,value); 1.2 this.splice(); 2.数据层次太多,没有触发render函数进行自动更新,需手动调用: this.$ ... 
- H5页面访问java后台进行登录拦截
			1.未登录状态下进行拦截,回到登录页面 function judgeLogin(currentPage) { var judge=false; var storage=window.localStor ... 
- selenium的定位方式
			1.selenium的定位方式 selenium有18种定位方式,8种单数,8种复数,2种父类 2.8种单数定位方式 from selenium import webdriverimport time ... 
- 软工个人作业4——Alpha阶段个人总结
			一.个人总结 1.在alpha 结束之后, 每位同学写一篇个人博客, 总结自己的alpha 过程: 经过本次alpha阶段的冲刺,首先学到了很多,收获了很多,同时也蛮辛苦的.其实我觉得作为组员我有很认 ... 
- 互动科技  快乐分享  X/Open DTP——分布式事务模型
			这一几天一直在回顾事务相关的知识,也准备把以前了解皮毛的知识进行一些深入总结,虽然这一些知识并没有用到,但是了解其实现原理还是很有必要的,因为知道了原理,你也能把它实现出来. 在上一节事务的编程模型里 ... 
- .Net Core+Angular6 学习 第一部分(创建web api)
			. 创建.net core web api 1.1 选择一个empty 模式,里面只有简单的2个class 1.2 配置web api 的路由. 1.2.1 打开Startup.cs,首先引用conf ... 
