• 2016京胜杯-吃在工大


    题目描述

    JH和他的好朋友YZ两名程序员回访母校合工大,准备在这住一段日子,都说“玩在安大,吃在工大”,JH又是一名典型吃货,于是决定在工大食堂好好吃一段日子,但是,面对美食诱惑:黄焖鸡、风暴干锅、麻辣香锅、奥尔良烤翅…由于时间有限,JH不知道哪顿饭吃哪个菜好。 于是YZ为了帮助他解决这个问题,也顺便考考他,给他出了一个问题:“黄焖鸡必须在干锅花菜前面吃,干锅牛肉必须在干锅鱿鱼前面吃….你按这个要求下,就知道吃的顺序啦”。JH抓抓头,分分钟写了个程序搞定,现在,让你来写写看?输出一组JH符合条件下吃的食物的序列。 假设JH每顿只吃一种食物,且每顿吃的都不同,食物编号1到N。

    输入

    先输入一个整数T,表示T(T < 50)组数据。 每组数据第一行输出一个整数,N,M,分别表示有N种食物,总共有M个约束条件,接下来M行每行输入两个正整数a,b( n > = a > 0,n > = b > 0),表示食物a必须在食物b之前吃。

    输出

    各组数据输出答案占一行,输出一组符合条件的序列(要求输出字典序最大的那一组),如果答案不存在,输出“-1”。

    样例输入

    1
    4 3
    1 2
    2 3
    4 3

    样例输出

    4 1 2 3

    思路

    此题主要运用拓扑排序

    1. 首先读取数据,存入一个图中,同时记录每个节点的入度;
    2. 然后再将入度为0的节点加入都优先队列中;
    3. 取优先队列的队首元素,并将此元素存到数组result中,然后依次遍历此节点的邻接点,同时将邻接点的入度减1,并将邻接点中入度为0的加入到优先队列中;
    4. 重复步骤三,直到队列为空;

    code

    #include <iostream>
    #include <queue>
    #include <cstring>
    #include <fstream>
    using namespace std;
    
    int G[1005][1005];
    bool vis[1005];
    int n, m;
    
    bool isStart(int k)
    {
        for(int i = 0; i <= n; i ++)
        {
            if(G[i][k])
            {
                return false;
            }
        }
        return true;
    }
    
    bool hasHoop()
    {
        for(int i = 1; i <= n; i ++)
        {
            if(!vis[i])
            {
                return true;
            }
        }
        return false;
    } 
    
    void Do()
    {
        priority_queue<int> pq;
        int loc = 0;
        int ans[1005];
        for(int i = 1; i <= n; i++)
        {
            if(isStart(i))
            {
                pq.push(i);
            }
        }
        while(!pq.empty())
        {
            //cout << "11" << endl;
            int k = pq.top();
            pq.pop();
            if(vis[k])
            {
                continue;
            }
            ans[loc++] = k;
            vis[k] = true;
            for(int i = 1; i <= n; ++ i)
            {
                G[k][i] = 0;
                if(isStart(i))
                {
                    pq.push(i);
                }
            }
        }
        if(hasHoop())
        {
            cout << "-1" << endl; 
        }
        else
        {
            for(int i = 0; i < n; i ++)
            {
                if(i)
                {
                    cout << " ";
                }
                cout << ans[i];
            }
            cout << endl;
        }
    }
    
    int main()
    {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        //ifstream cin("data.in");
        int T;
        cin >> T;
        while(T --)
        {
            cin >> n >> m;
            memset(G, 0, sizeof(G));
            memset(vis, false, sizeof(vis));
            for(int i = 0; i < m; i ++)
            {
                int a, b;
                cin >> a >> b;
                G[a][b] = 1;
            }
            Do();
        }
        return 0;
    }
  • 相关阅读:
    一定要在3 20前完成所有的程序开发工作
    浅谈图像处理方向的就业前景[转)
    期待牛人指教的问题?
    vc6 7工程转vc8时的问题
    今天的工作计划
    定点数与浮点数区别
    difference between texRECT and tex2D
    Render to Texture
    不明白gluperpective的fovy参数
    批处理程序教程(转)
  • 原文地址:https://www.cnblogs.com/topk/p/6580089.html
Copyright © 2020-2023  润新知