POJ 3687 Labeling Balls
来源:互联网 发布:魅族网络打印 编辑:程序博客网 时间:2024/06/13 12:25
Description
Windy has N balls of distinct weights from 1 unit to N 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 with a 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 integers a and b indicating the ball labeled witha must be lighter than the one labeled with b. (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
54 04 11 14 21 22 14 12 1
Sample Output
1 2 3 4-1-12 1 3 41 3 2 4
思路:刚开始看这个题当成了简单的拓扑排序,后来发现是我想的太简单了。
10 54 18 17 84 12 8
5 1 6 2 7 8 3 4 9 10参考这个样例就可以发现问题所在。
正确的做法是每次找到入度的所有点中,index最大的一个并加到排列中。然后更新其他点的入度。可以用优先队列做,也可以直接每次都直接找。
代码:
#include<algorithm>#include<iostream>#include<cstdio>#include<cstring>#include<climits>#include<cstdlib>#include<cmath>#include<queue>using namespace std;typedef long long LL;const int MAXN=410;int G[MAXN][MAXN];int in[MAXN];int weight[MAXN];int n;bool toposort(){ for(int i=n;i>=1;i--) { int k; for(k=n;k>=1;k--) if(in[k]==0) { weight[k]=i; in[k]--; break; } if(k<1) return false; for(int j=1;j<=n;j++) if(G[k][j]) in[j]--; } return true;}int main(){#ifdef LOCAL freopen("in.txt","rb",stdin); //freopen("out.txt","wb",stdout);#endif int tt; scanf("%d",&tt); while(tt--) { int m; scanf("%d%d",&n,&m); memset(G,0,sizeof(G)); memset(in,0,sizeof(in)); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); if(!G[v][u]) { in[u]++; G[v][u]=1; } } if(toposort()) { for(int i=1;i<=n;i++) { if(i!=n) printf("%d ",weight[i]); else printf("%d\n",weight[i]); } } else printf("-1\n"); } return 0;}
- poj 3687 Labeling Balls
- POJ 3687 Labeling Balls
- poj 3687 Labeling Balls
- POJ 3687 Labeling Balls
- poj-3687-Labeling Balls
- POJ 3687 Labeling Balls
- POJ 3687 Labeling Balls
- POJ 3687 Labeling Balls
- poj 3687 Labeling Balls
- POJ 3687 Labeling Balls
- poj 3687 Labeling Balls
- poj 3687 Labeling Balls
- poj 3687 Labeling Balls
- POJ 3687 Labeling Balls
- poj 3687 Labeling Balls
- poj 3687 Labeling Balls
- poj 3687 Labeling Balls
- POJ【3687】Labeling Balls
- HDOJ 2066 一个人的旅行(最短路)
- 求两个二进制数的最大公约数
- 初窥 CATransform3D 文档解读
- 计算机网络问题总结
- itoo在线编辑学习——nignx
- POJ 3687 Labeling Balls
- 前台网页规划
- Win8.1 远程桌面多用户登录方法
- Android 6.0 changes 上
- 判断一个变量是否属于数组类型
- FZU 2219 StarCraft (贪心 优先队列)
- cookie和session的区别
- POJ1836——Alignment
- 博弈论习题集(由易到难)