hdu 4857 逆向拓扑排序+逆向输出
2014-07-21 10:39
183 查看
逃生
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 341 Accepted Submission(s): 66
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
/*刚开始做的时候以为就是一个拓扑排序,但是提交就是不对,后来想一想,题意理解有问题。 题目让1号尽量靠前,然后依次是其他的,所以得让小的尽量靠前,可以反向建立关系,输出的时候 先输出最大的,最后再反向输出,就行了。注意:不用考虑重边的问题。*/ #include<stdio.h> #include<vector> #include<queue> #include<string.h> #define N 30005 using namespace std; vector<int>g ,ma; int n,degree ; void bfs() { int i,x; priority_queue<int>q; for(i=1;i<=n;i++) if(degree[i]==0) q.push(i); while(!q.empty()) { x=q.top(); q.pop(); ma.push_back(x); for(i=0;i<g[x].size();i++) { degree[g[x][i]]--; if(degree[g[x][i]]==0) q.push(g[x][i]); } } } int main() { int t,m,x,y,i; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); memset(degree,0,sizeof(degree)); for(i=1;i<=n;i++) g[i].clear(); ma.clear(); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); g[y].push_back(x); degree[x]++; } bfs(); for(i=ma.size()-1;i>=0;i--) { if(i==ma.size()-1) printf("%d",ma[i]); else printf(" %d",ma[i]); } printf("\n"); } return 0; } /* 1 4 2 3 1 2 4 正确输出是3 1 2 4 而不是 2 3 4 1 */
相关文章推荐
- hdu 4857 逆向建图+拓扑排序 ***
- hdu 4857 逃生(逆向拓扑排序)(STL应用)
- hdu--1285 && 4857 --正向 || 逆向拓扑排序 && 优先队列
- hdu 4857/BestCoder Round#1 1001(拓扑排序+逆向建图)
- hdu 4857 逃生(逆向拓扑排序)(STL应用)
- HDOJ 4857 逃生 (逆向拓扑排序)
- HDU 4857 逃生(拓扑排序)
- hdu 4857 逃生 拓扑排序
- hdu 4857(逆序拓扑排序)
- hdu 4857 逃生 拓扑排序
- HDU-4857(拓扑排序)
- HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)
- hdu 4857 逃生(拓扑排序)
- hdu-4857 逃生 拓扑排序
- HDU - 4857 逃生(反向建图 + 拓扑排序)
- hdu 4857 逃生【反向拓扑排序】
- HDU 4857 (反向拓扑排序 + 优先队列)
- HDU 4857 逃生(拓扑排序)
- hdu-4857-逃生-拓扑排序
- hdoj 4857 逃生 【拓扑排序 输出字典序最小解】