POJ 3687:Labeling Balls(优先队列+拓扑排序)

来源:互联网 发布:mac怎么进入苹果系统 编辑:程序博客网 时间:2024/06/06 22:07

Labeling Balls


Time Limit: 1000MS
Memory Limit: 65536KTotal 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:

  1. No two balls share the same label.
  2. 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) andM (0 ≤ M ≤ 40,000). The nextM line each contain two integersa andb indicating the ball labeled witha must be lighter than the one labeled withb. (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 14 13 2

Sample Output

1 2 3 4-1-12 1 3 41 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;}







0 0
原创粉丝点击