POJ 3687:Labeling Balls(优先队列+拓扑排序)
Posted mthoutai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3687:Labeling Balls(优先队列+拓扑排序)相关的知识,希望对你有一定的参考价值。
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10178 | Accepted: 2815 |
Description
Windy has N balls of distinct weights from 1 unit toN units. Now he tries to label them with 1 toN in such a way that:
- No two balls share the same label.
- The labeling satisfies several constrains like "The ball labeled witha is lighter than the one labeled withb".
Can you help windy to find a solution?
Input
The first line of input is the number of test case. The first line of each test case contains two integers,N (1 ≤N ≤ 200) and M (0 ≤ M ≤ 40,000). The nextM line each contain two integersa and b indicating the ball labeled witha must be lighter than the one labeled withb. (1 ≤ a, b ≤N) There is a blank line before each test case.
Output
For each test case output on a single line the balls‘ weights from label 1 to labelN. If several solutions exist, you should output the one with the smallest weight for label 1, then with the smallest weight for label 2, then with the smallest weight for label 3 and so on... If no solution exists, output -1 instead.
Sample Input
5
4 0
4 1
1 1
4 2
1 2
2 1
4 1
2 1
4 1
3 2
Sample Output
1 2 3 4
-1
-1
2 1 3 4
1 3 2 4
在主要的拓扑排序的基础上又添加了一个要求:编号最小的节点要尽量排在前面;在满足上一个条件的基础上,编号第二小的节点要尽量排在前面;
在满足前两个条件的基础上。编号第三小的节点要尽量排在前面……依此类推。点击打开链接又是看结题报告。。。
。哎。。
。。
太弱了
第一百篇。。留念。。。
#include<cstdio> #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<vector> using namespace std; const int M = 250 ; int t, n, m; int outint[M]; int out[M]; int in[M]; int cut; vector<int>amap[M]; int flag; bool toposort() { cut = 0; priority_queue<int>que; for(int i=1; i<=n; i++) if( !in[i] ) que.push(i); while( !que.empty() ) { int u = que.top(); que.pop(); outint[ cut++] = u; for( int i=0; i<amap[u].size(); i++ ) { int v = amap[u][i]; if( --in[v]==0 ) que.push(v); } } if( cut<n ) return false; else return true; } int main() { scanf( "%d", &t ); while( t-- ) { memset( in, 0, sizeof(in) ); scanf( "%d%d", &n, &m ); for( int i=1; i<=n; i++ ) amap[i].clear(); for( int i=1; i<=m; i++ ) { int a, b; scanf( "%d%d", &a, &b ); amap[b].push_back(a); in[a]++; } if( !toposort() ) printf("-1\n"); else { for( int i=0; i<n; i++ ) out[ outint[i] ] = n-i; for(int i=1; i<=n; i++) { if(i<n) printf( "%d ", out[i] ); else printf( "%d\n", out[i] ); } } } return 0; }
以上是关于POJ 3687:Labeling Balls(优先队列+拓扑排序)的主要内容,如果未能解决你的问题,请参考以下文章
POJ 3687 Labeling Balls(特殊的拓扑排序)
POJ 3687 Labeling Balls(反向拓扑+贪心思想!!!非常棒的一道题)