逃生

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1161    Accepted Submission(s): 368

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
BestCoder Round #1
这道题,因为关于名次问题,属于拓扑排序的范畴,但是数据规模很大,不利于建图来求索,于是运用邻接表(或者用vector来模拟),由于以小优先,所以我们不妨采用拓扑图第二种方法,即反向推到,但是若采取普通的拓扑图会TLE,这里有需要去进一步优化,即采用优先队列来存取出度为0的的点...
代码:356ms
#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
const int maxn=30005;
vector<vector<int> >mat;
stack<int >ans;
int outdg[maxn];
struct cmp{bool operator ()( int &a,int &b){return a<b;}
};
priority_queue<int,vector<int>,cmp>aa;
int n,m;
void tp_sort(){int len,i;while(!aa.empty()){i=aa.top();aa.pop();ans.push(i);len=mat[i].size();for(int j=0;j<len;j++){outdg[mat[i][j]]--;if(outdg[mat[i][j]]==0)aa.push(mat[i][j]);}}
}
int main(){//  sync_with_stdio(1);int cas,i,a,b;scanf("%d",&cas);while(cas--){scanf("%d%d",&n,&m);mat.clear();mat.resize(n+2);memset(outdg,0,sizeof(int)*(n+1));for(i=0;i<m;i++){scanf("%d%d",&a,&b);mat[b].push_back(a);outdg[a]++;}for(i=n;i>=1;i--)if(outdg[i]==0)aa.push(i);tp_sort();printf("%d",ans.top());ans.pop();while(!ans.empty()){printf(" %d",ans.top());ans.pop();}puts("");}
return 0;
}

hdu-----(4857)逃生(拓扑排序)相关推荐

  1. hdu 4857 逃生 拓扑排序

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

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

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

  3. HDU 4857 逃生 (反向拓扑排序 容器实现)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  4. HDU 4857 逃生 【拓扑排序+反向建图+优先队列】

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

  5. HDU 4857 逃生(拓扑排序)

    拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈ ...

  6. 反向拓扑排序 HDU 4857 逃生

    题意:n个结点,m个拓扑关系(a,b)表示a必须排在b前面,在满足m个拓扑关系关系的前提下使得小的结点尽可能的排在前面.也就是说我们现在要从1号结点开始考虑,如果要排1号结点,根据拓扑关系,首先必须排 ...

  7. hdu 5438 Ponds 拓扑排序

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

  8. HDU 2647 Reward (拓扑排序)

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

  9. HDU 2647 Reward 拓扑排序

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

最新文章

  1. VS 2005 文本编码小技巧 --中文亂碼問題解決
  2. secureCRT的安装及破解
  3. serialize-and-deserialize-bst
  4. 如何为报表服务器设置SQL Server数据库复制
  5. winedt (latex 编译器)解决中文的问题(CJK CTEX)
  6. 从零开始学wordpress 之四
  7. WPF 使用附加属性增加控件属性
  8. Dockerfile文件:使用脚本文件生成镜像
  9. xjad使用中的几个问题
  10. 【不务正业】之前端HTML基础(二)
  11. 一定要记住这20种PS技术!来美化你的照片
  12. 判断分解的无损连接性和保持函数依赖
  13. 问题:加入导航条后webView的UIWebBrowserView位置偏移
  14. social network 学习心得
  15. 智能化的Conversational UI是移动发展的一个趋势
  16. 简述人工智能发展的先决条件
  17. Everything指定用XYplorer打开目录路径
  18. IAR中使用IELFTOOL进行软件代码checksum的生成和添加
  19. Basler驱动如何彩色相机白平衡说明
  20. 真香!有了这个搜索大法,GitHub玩到飞起来!

热门文章

  1. python-全栈开发-前方高能-内置函数
  2. asp.net 无法获取客户端请求的真实协议https
  3. Vulkan Tutorial 14 Integration pipeline
  4. 标准非STL容器 : bitset
  5. [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.23
  6. Windows 8 系列 --Block Game --随笔
  7. linux 下共享库创建及使用
  8. Java程序员从笨鸟到菜鸟之(一)开发环境搭建,基本语法,字符串,数组
  9. 明确需求与功能,优化小打卡的分享刺激点
  10. linux中的软RAID实现,逻辑卷和btrfs文件系统