HDU-2647拓扑排序】的更多相关文章

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员工的奖金多,老板满足了所以员工的这种心思,而且老板下午发的总工资最少,问最少是多少?比如 a b 表示a的工资比b要高(高一块钱),当出现a b   b c   c a这种环的时候输出-1 拓扑排序http://www.cnblogs.com/tonghao/p/4721072.html 小指向大…
题意:每个人的工资至少888,然后有m个条件,前者比后者要多.求最少工资. 分析: 最开始的开邻接矩阵的肯定超时,如果dfs,会出现由于刚开始不是从入度为0的点出发,后期修改不了.比较麻烦. 正确方式是,用队列实现,不需要像普通队列一样,用vis数组标记,而是根据入度是否为0的标准加入队列. /* #include <bits/stdc++.h> using namespace std; const int maxn = 10000+5; int n,m; vector<int>…
#include<stdio.h> #include<queue> #include<vector> #include<iostream> using namespace std; #define  N  11000 int n,m,sum; int indegree[N],value[N]; vector<int>now[N]; int Max(int a,int b) { return a>b?a:b; } int find() {  …
#include<stdio.h> #include<queue> #include<iostream> using namespace std; #define  N  11000 int n,m,sum; struct node { int indegree,num; int value,next[300]; }now[N]; int Max(int a,int b) { return a>b?a:b; } int find() {        queue&…
n个数,已经有大小关系,现给m个约束,规定a在b之前,剩下的数要尽可能往前移.输出序列 大小关系显然使用拓扑结构,关键在于n个数本身就有大小关系,那么考虑反向建图,优先选择值最大的入度为零的点,这样得到的序列就是从大到小的,最后倒序输出就行了. 写这题的时候头好痛阿肚子好痛阿,再也不想熬夜了,一点效率都没有. /** @Date : 2017-09-29 19:29:12 * @FileName: HDU 4857 拓扑排序 + 优先队列.cpp * @Platform: Windows * @…
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0的点个数是否大于1,如大于1则不完全:最终状态检查是否所有点都具有大小关系,遍历过说明有入度.但是由于“=”的存在,要考虑将指向相等数的边全部移到一个数上,故使用并查集预先将相等的点连成块,再进行拓扑排序就行了. /** @Date : 2017-09-22 13:58:31 * @FileName…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5638 题意: 给你一个DAG图,删除k条边,使得能个得到字典序尽可能小的拓扑排序 题解: 把拓扑排序的算法稍微改一下,如果某个顶点的入度小于k也把它加到优先队列里面去. k减小后队列里面会有些点不满足<=k,直接踢出来就好了. 代码: #include<iostream> #include<cstring> #include<cstdio> #include<…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5961 题目为中文,这里就不描述题意了. 思路: 从题目陈述来看,他将一个有向图用一个邻接矩阵来表示,并且分为两个图P.Q,但是它们是有内在联系的,即:P+Q,抛去方向即为完全图. 题目都是中文,这里就不翻译了.我们可以从题目中知道,如果P.Q均满足传递性,那么P与(Q的反向图)生成的有向图应该无环. 所以,简单一个拓扑排序检查是否有环即可,P.Q合为一张图,跑一遍,这个还是很快的. 时长:3432MS…
题意:给出一堆人的喜爱关系,判断有没有三角恋-_-|| 其实就是判断是否存在三条边的环. 一开始我是这么想的: 先拓扑排序,如果没有环那就直接No 如果有环?挑出环里的任意一个点(拓扑排序结束后不在拓扑序里面的点就在环里),然后从这个点开始dfs,看三步之后能不能回到这个点.(可以证明,只要考察一个点就行) 然而TLE了= = 其实仔细想想可以发现,后面那个dfs没有必要. 注意一个细节:A[i][j]<>A[j][i].也就是说若i到j不通,那么j到i一定通 可以证明,若这样的图中存在环,那…
因为题目说了,两个人之间总有一个人喜欢另一个人,而且不会有两个人互相喜欢.所以只要所给的图中有一个环,那么一定存在一个三元环. 所以用拓扑排序判断一下图中是否有环就行了. #include <cstdio> #include <cstring> + ; char G[maxn][maxn]; int c[maxn]; int n; bool dfs(int u) { c[u] = -; ; v < n; v++) ') { ) return false; if(!c[v] &…
Ponds Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 3234    Accepted Submission(s): 997 Problem Description Betty owns a lot of ponds, some of them are connected with other ponds by pipes, a…
好久没切题  先上水题! 拓扑排序! 代码: #include<iostream> #include<cstdio> #include<cstring> using namespace std; int g[105][105]; int d[105]; int N,M; bool Topsort() { for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { if(g[i][j]==1) { d[j]++; } } } f…
产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 12031    Accepted Submission(s): 5583 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能…
Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 681    Accepted Submission(s): 271 Problem Description 众所周知,度度熊喜欢各类体育活动. 今天,它终于当上了梦寐以求的体育课老师.第一次课上,它发现一个有趣的事情.在上课之前,所有同学要排成一列, 假设最开始每个人有…
根据题目所给的3个不符合情况的条件,一个个判断图是否符合这3个条件即可 1.不能出现内部环,拓扑排序判断 2.不能有超过1个点的入度为0,因为只有一个树根 3.每个点最多一个入度 这里要注意的一点是这个点的数字是乱给的,所以最大值为8,但实际上不一定有8个点,这里记录一个最大值的参数,和一个总共点数的参数来进行判断即可 #include <cstdio> #include <cstring> #include <iostream> using namespace std…
http://www.cnblogs.com/newpanderking/archive/2012/10/18/2729566.html #include<stdio.h> #include<iostream> #include<vector> #include<queue> using namespace std; const int N=11000; vector<int>link[N];//容器来是模拟邻接表 int pre[N],a[N]…
例题:hdu 5154 链接  http://acm.hdu.edu.cn/showproblem.php?pid=5154 题目意思是第一行先给出n和m表示有n件事,m个关系,接下来输入m行,每行有a,b两个数,他们之间的关系就是第a件事要在 第b件事之前做完,然后问你可不可以在符合这m个关系的情况下把这n件事情做完,可以就输出YES,否则输出NO. 现在先假设a b之间的关系用a指向b来表示,即a-->b. 题目里给的两个样例有点简单,来个稍微复杂一点的好吧. 第一次搞这个,不太会,见谅.看…
Legal or Not Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10407 Accepted Submission(s): 4876 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is so h…
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<stdlib.h> #define N 1100 #include<map> using namespace std; int pre[N],indegree[N]; int find(int x) { if(pre[x]…
 注意点: 输入数据中可能有重复,需要进行处理! #include <stdio.h> #include <iostream> #include <cstring> #include <vector> #include <algorithm> #include <sstream> using namespace std; int n, m; ]; ][]; int main() { while(scanf("%d %d&qu…
hdu 2647 Reward Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u 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…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意是给你n点m条有向边,叶子点(出度为0)上的值为888,父亲点为888+1,依次计算... 让你求最小的值,但是中间出现有向环就不行了,输出-1. 拓扑排序队列实现,因为叶子是最小的,所以把边反向就可以求了. //拓扑队列实现 //就是先把入度为0的先入队,然后每次出队的时候把相邻的点的入度减1,要是入度为0则再入队,不断循环直到队列为空 //时间复杂度为O(N + E) //这题就是把边…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 题目大意:要给n个人发工资,告诉你m个关系,给出m行每行a b,表示b的工资小于a的工资,最低工资为888,求最少要发多少工资,如果关系矛盾就输出“-1”. 解题思路:用拓扑排序解决,但是要分层,类似于多棵树的层次遍历,用dis[i]存储i所在层数(起点为0层),因为要是所有条件都符合,所以dis[i]取最大值.还有注意判断是否存在环. 代码: #include<iostream> #inc…
HDU.2647 Reward(拓扑排序 TopSort) 题意分析 裸的拓扑排序 详解请移步 算法学习 拓扑排序(TopSort) 这道题有一点变化是要求计算最后的金钱数.最少金钱值是888,最少的差额是1,如1号的人比2号钱要多,2号至少是1号人的钱数+1.根据拓扑排序的思想,我们只需要类比二叉树的层序遍历,每次取出入度为0的节点做处理,累加金钱数量,然后再取出入度为0的节点处理.直到取出所有的点或者判断成环即可. 代码总览 #include <iostream> #include <…
题目链接: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 rewar…
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…
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11836 Accepted Submission(s): 3804 Problem Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants…
令每一个员工都有一个自己的等级level[i] , 员工等级越高,那么工资越高,为了使发的钱尽可能少,所以每一级只增加一单位的钱 输入a b表示a等级高于b,那么我们反向添加边,令b—>a那么in[a]++,再进行拓扑排序,每次都让边的终点的level值大于起始点,那么要用max取较大值 #include <iostream> #include <cstdio> #include <cstring> #include <queue> using nam…
Reward HDU - 2647 题意:每个人的起始金额是888,有些人觉得自己做的比另一个人好所以应该多得一些钱,问最少需要花多少钱,如果不能满足所有员工的要求,输出 -1 样例1: 2 1 1 2 输出1777 1认为自己的报酬应该比2多,所以2为888,1为889是最小的情况 样例2: 5 4 1 2 2 5 2 4 4 3 输出4446 相当于给定一张图,n个节点,m条边,问你是否存在环,若存在,则输出-1,为什么?因为存在环的话无法满足所有人的需求例如1->2,1->1,1想比2大…
题意:每一个人的基础工资是888. 因为一部分人要显示自己水平比較高,要求发的工资要比其它人中的一个人多.问你能不能满足他们的要求,假设能的话终于一共要发多少钱,假设不能就输出-1. 策略:拓扑排序. 这道题有些难点:一:数据大,建二维数组肯定不行,要换其它的数据结构(vector, 或者是链式前向星(本题代码用的是链式前向星)): 二:要逆拓扑排序(就是将++in[b]换成++in[a]). 三要分层次(依据上一个的钱数+1就可以). 不懂什么是链式前向星 移步:http://blog.csd…