zoukankan      html  css  js  c++  java
  • hdu 4857 逃生 拓扑排序

    逃生

    题目连接:

    http://acm.hdu.edu.cn/showproblem.php?pid=4857

    Description

    糟糕的事情发生啦,现在大家都忙着逃命。但是逃命的通道很窄,大家只能排成一行。

    现在有n个人,从1标号到n。同时有一些奇怪的约束条件,每个都形如:a必须在b之前。
    同时,社会是不平等的,这些人有的穷有的富。1号最富,2号第二富,以此类推。有钱人就贿赂负责人,所以他们有一些好处。

    负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推。

    那么你就要安排大家的顺序。我们保证一定有解。

    Input

    第一行一个整数T(1 <= T <= 5),表示测试数据的个数。
    然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和约束的个数。

    然后m行,每行两个整数a和b,表示有一个约束a号必须在b号之前。a和b必然不同。

    Output

    对每个测试数据,输出一行排队的顺序,用空格隔开。

    Sample Input

    1

    5 10

    3 5

    1 4

    2 5

    1 2

    3 4

    1 4

    2 3

    1 5

    3 5

    1 2

    Sample Output

    1 2 3 4 5

    Hint

    题意

    题解:

    反着做,其实就是把编号最大的,且入度为0的边放到最后去

    然后拓扑排序做一做就好了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    #define maxn 50000
    vector<int> E[maxn];
    vector<int> ans;
    int cnt[maxn];
    int tot = 1;
    void init()
    {
        tot = 1;
        ans.clear();
        memset(cnt,0,sizeof(cnt));
        for(int i=0;i<maxn;i++)
            E[i].clear();
    }
    priority_queue<int> Q;
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            init();
            int n,m;
            scanf("%d%d",&n,&m);
            for(int i=1;i<=m;i++)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                E[y].push_back(x);
                cnt[x]++;
            }
            for(int i=1;i<=n;i++)
                if(cnt[i]==0)Q.push(i);
            while(!Q.empty())
            {
                int p = Q.top();
                Q.pop();
                ans.push_back(p);
                for(int i=0;i<E[p].size();i++)
                {
                    int v = E[p][i];
                    cnt[v]--;
                    if(cnt[v]==0)
                        Q.push(v);
                }
            }
            for(int i=n-1;i>=0;i--)
            {
                if(i==n-1)printf("%d",ans[i]);
                else printf(" %d",ans[i]);
            }
            printf("
    ");
        }
    }
  • 相关阅读:
    [LeetCode] 1103. Distribute Candies to People 分糖果
    [LeetCode] 994. Rotting Oranges 腐烂的橘子
    [LeetCode] 面试题 10.01.合并排序的数组
    [LeetCode] 207. Course Schedule 课程表
    Windows下利用virtualenvwrapper指定python版本创建虚拟环境
    Vagrant Ansible Playbook 安装一群虚拟机
    selenium grid的使用与配置
    selenium之 玩转鼠标键盘操作(ActionChains)
    Python3.7 dataclass 介绍
    简单的验证码识别
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5120508.html
Copyright © 2011-2022 走看看