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:

  1. No two balls share the same label.
  2. 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, bN) 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;}

0 0
原创粉丝点击