• 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;
    }
    







  • 相关阅读:
    poj1363Rails(栈模拟)
    centos6.5设备mysql5.6
    SGU326Perspective(网络流量的最大流量)(经典赛车模型)
    扩大或缩小undo表空间
    Boost源代码学习---shared_ptr.hpp
    leetcode
    为客户打造RAC-DG一些遇到的问题汇总
    十归并排序有用的算法和二进制搜索的基础
    Delphi TNativeXML Node节点乱码的一种解决方法
    Delphi TcxTreeList 读取 TcxImageComboBoxItem类型的值
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7258459.html
Copyright © 2020-2023  润新知