zoukankan      html  css  js  c++  java
  • 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:

    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) 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, 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

    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
    ");
            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
    ", out[i] );
                }
            }
        }
    
        return 0;
    }
    







  • 相关阅读:
    Code Forces Gym 100886J Sockets(二分)
    CSU 1092 Barricade
    CodeChef Mahesh and his lost array
    CodeChef Gcd Queries
    CodeChef GCD2
    CodeChef Sereja and LCM(矩阵快速幂)
    CodeChef Sereja and GCD
    CodeChef Little Elephant and Balance
    CodeChef Count Substrings
    hdu 4001 To Miss Our Children Time( sort + DP )
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7258459.html
Copyright © 2011-2022 走看看