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

pid=4857

------------------------------------------------------------------------------------------------------------------------------------------------------
欢迎光临天资小屋http://user.qzone.qq.com/593830943/main

------------------------------------------------------------------------------------------------------------------------------------------------------

逃生

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 619    Accepted Submission(s): 167
Problem Description
糟糕的事情发生啦,如今大家都忙着逃命。可是逃命的通道非常窄。大家仅仅能排成一行。



如今有n个人,从1标号到n。同一时候有一些奇怪的约束条件,每一个都形如:a必须在b之前。

同一时候,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。

有钱人就贿赂负责人,所以他们有一些优点。



负责人如今能够安排大家排队的顺序。因为收了优点,所以他要让1号尽量靠前。假设此时还有多种情况,就再让2号尽量靠前。假设还有多种情况,就让3号尽量靠前,以此类推。

那么你就要安排大家的顺序。我们保证一定有解。

 
Input
第一行一个整数T(1 <= T <= 5),表示測试数据的个数。

然后对于每一个測试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和约束的个数。



然后m行,每行两个整数a和b。表示有一个约束a号必须在b号之前。

a和b必定不同。

 
Output
对每一个測试数据,输出一行排队的顺序。用空格隔开。
 
Sample Input
1
5 10
3 5
1 4
2 5
1 2
3 4
1 4
2 3
1 5
3 5
1 2

Sample Output
1 2 3 4 5
 
Author
CLJ
 
Source

题目要求要求在满足约束条件的情况下,使小的序号尽力靠前。

坑点就在这里。小的序号尽量靠前并非代表字典序。它要求多种情况时,先使1靠前(可能1仅仅能在第2或第3位 那么就要使它在第2位),其次2,3。。而不是在当前情况下。该位最小是哪个就输出哪个



代码例如以下:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
#define N 30017
int n, m;
int i, j, k;
int v[N],ans[N];
vector<int>P[N];
void init()
{
memset(ans,0,sizeof(ans));
memset(v,0,sizeof(v));
}
void Topsort()
{
priority_queue<int>Q;
int size, t;
for(i = 1; i <= n; i++)
{
if(v[i] == 0)
Q.push(i);
}
while(!Q.empty())
{
t = Q.top();
Q.pop();
size = P[t].size();
for(i = 0; i < size; i++)//相关联的入度减1
{
v[P[t][i]]--;
if(v[P[t][i]] == 0)
Q.push(P[t][i]);
}
ans[k++] = t;
}
}
int main()
{
int T;
int a, b;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d",&n,&m);
for(i = 1; i <= n; i++)//清空
{
P[i].clear();
}
for(i = 0; i < m; i++)
{
scanf("%d%d",&a,&b);
v[a]++;
P[b].push_back(a);//逆向建图。在b后面加入a
}
k = 0;
Topsort();
for(i = n-1; i > 0; i--)//逆向输出
{
printf("%d ",ans[i]);
}
printf("%d\n",ans[0]);
}
return 0;
}

hdu4857 &amp; BestCoder Round #1 逃生(拓扑逆排序+优先队列)的更多相关文章

  1. hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]

    传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131 ...

  2. HDU5777 domino (BestCoder Round #85 B) 思路题+排序

    分析:最终的结果肯定会分成若干个区间独立,这些若干个区间肯定是独立的(而且肯定是一边倒,左右都一样) 这样想的话,就是如何把这n-1个值分成 k份,使得和最小,那么就是简单的排序,去掉前k大的(注意l ...

  3. hdu-----(4857)逃生(拓扑排序)

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  4. hdu 4857 逃生 拓扑排序+PQ,剥层分析

    pid=4857">hdu4857 逃生 题目是求拓扑排序,但不是依照字典序最小输出,而是要使较小的数排在最前面. 一開始的错误思路:给每一个点确定一个优先级(该点所能到达的最小的点) ...

  5. hdu 4857 逃生 拓扑排序+逆向建图

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Descr ...

  6. BestCoder Round #89 02单调队列优化dp

    1.BestCoder Round #89 2.总结:4个题,只能做A.B,全都靠hack上分.. 01  HDU 5944   水 1.题意:一个字符串,求有多少组字符y,r,x的下标能组成等比数列 ...

  7. BestCoder Round #90 //div all 大混战 一题滚粗 阶梯博弈,树状数组,高斯消元

    BestCoder Round #90 本次至少暴露出三个知识点爆炸.... A. zz题 按题意copy  Init函数 然后统计就ok B. 博弈 题  不懂  推了半天的SG.....  结果这 ...

  8. bestcoder Round #7 前三题题解

    BestCoder Round #7 Start Time : 2014-08-31 19:00:00    End Time : 2014-08-31 21:00:00Contest Type : ...

  9. Bestcoder round #65 && hdu 5593 ZYB's Tree 树形dp

    Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

随机推荐

  1. [AGC002D] Stamp Rally (并查集+整体二分)

    Description 给你一个n个点m个条边构成的简单无向连通图,有Q组询问,每次询问从两个点x,y走出两条路径,使这两条路径覆盖z个点,求得一种方案使得路径上经过的变的最大编号最小. Input ...

  2. What and How in an Application

    Basically, two concerntrations: 1. What: business docs and prototype design 2. How: technical docs a ...

  3. poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp

    题目链接 题意 给定一个\(N\)个点的完全图(有向图),求从原点出发,经过所有点再回到原点的最短路径长度(可重复经过中途点). 思路 因为可多次经过同一个点,所以可用floyd先预处理出每两个点之间 ...

  4. 【Visual Studio】以管理员的身份运行软件

  5. ASP.NET MVC验证所有属性是否合法

    1.实现代码: /// <summary> /// 验证所有属性是否合法 /// </summary> /// <param name="modelState& ...

  6. 洛谷——P1098 字符串的展开

    P1098 字符串的展开 题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输 ...

  7. 构建更好的HashMap

    在7月份的那期 Java理论与实践(“并发集合类”)中,我们简单地回顾了可伸缩性的瓶颈,并讨论了怎么用共享数据结构的方法获得更高的并发性和吞吐量.有时候学习的最好方法是分析专家的成果,所以这个月我们将 ...

  8. bzoj 5092: [Lydsy1711月赛]分割序列

    5092: [Lydsy1711月赛]分割序列 Time Limit: 5 Sec  Memory Limit: 256 MBSubmit: 219  Solved: 100[Submit][Stat ...

  9. What are Windows ACLs and why are they important?

    An access control list (ACL), with respect to a computer file system, is a list of permissions attac ...

  10. word 插入空白偶数页(论文、报告等写作常用)

    目前在写大论文的过程中,需要在偶数页中插入一个空白页,但是又不想在下面加上页码,所以采用通常的方式并不妥,所以就用到了这篇博文中内容,采用奇偶页的方式插入空白偶数页,而且偶数页也不会在上面出现任何的字 ...