HDU 4857 逃生
来源:互联网 发布:淘宝买家贷款5万怎么贷 编辑:程序博客网 时间:2024/05/01 09:51
逃生
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2585 Accepted Submission(s): 736
Problem Description
糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。
现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。
同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。
负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。
那么你就要安排大家的顺序。我们保证一定有解。
现在有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必然不同。
然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和约束的个数。
然后m行,每行两个整数a和b,表示有一个约束a号必须在b号之前。a和b必然不同。
Output
对每个测试数据,输出一行排队的顺序,用空格隔开。
Sample Input
15 103 51 42 51 23 41 42 31 53 51 2
Sample Output
1 2 3 4 5
Author
CLJ
Source
BestCoder Round #1
从头刷刷BestCoder,里面的题质量很不错的。
这道题,拓扑排序。
以前做的都是用邻接矩阵存储。
而这题的数据量N=30000,显然开个二维矩阵妥妥的超内存。
自然想到vector,要多少个结点,我给你多少就好了。
用vector存储图。
每次将入度为0的点放入队列,优先大的点出队。
最后反向输出即可。
这题编译的时候一开有一个Warning.后来百度了才知道,原来那里改成unsigned i就不会警告了。
#include <stdio.h>#include <string.h>#include <vector>#include<queue>#define N 30005using namespace std;int degree[N];vector<int> graph[N];struct cmp{bool operator()(const int &a,const int &b){return a<b;}};priority_queue<int,vector<int>,cmp> q;int ans[N];int main(){ int t,n,m; scanf("%d",&t); while(t--) { memset(degree,0,sizeof(degree)); scanf("%d%d",&n,&m); for(int i=0;i<=n;i++) graph[i].clear(); while(m--) { int a,b; scanf("%d%d",&a,&b); graph[b].push_back(a); degree[a]++; } while(!q.empty()) q.pop(); for(int i=1;i<=n;i++) if(degree[i]==0) q.push(i); int k=0; while(!q.empty()) { int fro=q.top(); q.pop(); ans[++k]=fro; for(unsigned int i=0;i<graph[fro].size();i++) { degree[graph[fro][i]]--; if(degree[graph[fro][i]]==0) q.push(graph[fro][i]); } } printf("%d",ans[k]); for(int i=k-1;i>0;i--) printf(" %d",ans[i]); printf("\n"); } return 0;}
0 0
- HDU 4857 逃生。
- hdu-4857-逃生
- hdu 4857 逃生
- HDU 4857 逃生
- HDU 4857 逃生
- hdu 4857 逃生
- HDU 4857 逃生
- HDU 4857:逃生【拓扑】
- hdu 4857 逃生
- HDU 4857 逃生
- hdu 4857 逃生
- 【HDU】 4857 逃生
- hdu 4857 逃生
- HDU 4857逃生
- hdu 4857 逃生
- HDU-4857 逃生
- HDU 4857 逃生(拓扑排序)
- hdu-4857-逃生-拓扑排序
- JAVA的String 类【转】
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0、OpenCV 2.4.8、OpenCV 2.4.9 +VS 开发环境配置
- IOS开发笔记10-字符串-C语言笔记
- JSP 自定义标签:简单标签
- Linux-CentOS 安装XPDF
- HDU 4857 逃生
- iOS8定位代理方法不回调,解决办法
- 软件工程第三章作业
- Remove Element
- [Leetcode]Pow(x, n)
- 数据结构之栈
- TCP传输客户端和服务器端的建立
- 传统线程同步通信技术
- 在VC6中调试MEX文件