hdu 4857 逃生 反向拓扑排序

news/2024/7/7 8:56:39

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

现在有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

一开始用的正向 不对
http://blog.csdn.net/u012861385/article/details/38059515
这位大佬写得很好
现在我的理解是 对于有约束有平行的拓扑排序,对于若干条平行的路径,小的头部不一定排在前面,但是大的尾部一定排在后面。因为头部会受到尾部的约束,但是尾部没有约束,可以直接比较即可,所以要反向建图拓扑

#include <bits/stdc++.h>
using namespace std;
const int N=30010;
int arr[N];
int in[N];
vector<int> v[N];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        memset(in,0,sizeof(in));
        for(int i=1;i<=n;i++)
            v[i].clear();
        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            v[b].push_back(a);
            in[a]++;
        }
         priority_queue<int> Q;
        for(int i=1;i<=n;i++)
            if(!in[i]) Q.push(i);
        int tot=0;
        while(!Q.empty())
        {
            int top=Q.top();
            Q.pop();
            arr[tot++]=top;
            for(int i=0;i<v[top].size();i++)
            {
                in[v[top][i]]--;
                if(!in[v[top][i]])
                    Q.push(v[top][i]);
            }
        }
        printf("%d",arr[tot-1] );
        for(int i=tot-2;i>=0;i--)
            printf(" %d",arr[i] );
        printf("\n");
    }
}

http://www.niftyadmin.cn/n/3617365.html

相关文章

预告:AI将如何重塑安防科技(格灵深瞳CEO赵勇主讲)丨硬创公开课

AI 技术的成熟&#xff0c;使得由人工智能来自动消化海量监控视频数据成为可能。目前&#xff0c;人工智能已经逐步渗透到安防行业&#xff0c;最终将会把以视频网络为核心的安防产业&#xff0c;重塑为以结构化数据为核心&#xff0c;以精确情报生产为目标的智慧物联网产业。 …

hdu 4858 项目管理 分块

转&#xff1a;http://blog.csdn.net/qwb492859377/article/details/46707425 一看到这题&#xff0c;首先会觉得非常像单点更新的线段树&#xff0c;但是却不怎么好操作 然后应该往分块的方向去想 因为只有m条边&#xff0c;所以所有点的度总和是2m,那么设度数>sqrt(m)的…

animation-timing-function的steps详解

W3C里的定义&#xff1a; animation-timing-function 规定动画的速度曲线。 这个属性有很多取值&#xff0c; linear&#xff1a; 线性过渡。等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0) ease&#xff1a; 平滑过渡。等同于贝塞尔曲线(0.25, 0.1, 0.25, 1.0) ease-in&#xff1a; 由…

2020统一省选A卷题解

D1T1 线段树上二分。有一些需要注意的地方&#xff0c;二分时去往一边时要记下另一边端点处的答案。因为要取温度的最高值&#xff0c;需要找到答案后再找到最靠右的火战士和等于答案中的火战士和的位置。 Code&#xff1a; #include<bits/stdc.h> #define maxn 20000…

5G时代,网络将如何重构?

5G时代渐行渐近&#xff0c;在人们对丰富应用充满憧憬的同时&#xff0c;也更加关注5G技术的发展。5G对于网络架构将提出哪些新的需求?什么样的技术创新才符合5G演进方向?运营商将以怎样的姿态全面拥抱5G?在日前召开的“网络重构与5G技术研讨沙龙”上&#xff0c;来自业界各…

【ES6】中构造函数的语法糖 —— Class(类)

在现代前端开发中&#xff0c;JavaScript的面向对象编程成为了主流。ES6引入了class关键字&#xff0c;使得开发者可以更方便地使用面向对象的方式编写代码&#xff0c;更接近传统语言的写法。ES6的class可以看作是一个语法糖&#xff0c;它的绝大部分功能ES5都可以做到&#x…

typedef typename

所以根据上述两条分析&#xff0c; typedef typename RefBase::weakref_type weakref_type; 语句的真是面目是&#xff1a; typedef创建了存在类型的别名&#xff0c;而typename告诉编译器RefBase::weakref_type是一个类型而不是一个成员。转载于:https://www.cnblogs.com/zhou…

LOJ#2320. 「清华集训 2017」生成树计数

题目描述&#xff1a; 图中有 nnn 个连通块&#xff0c;每个连通块有 aia_iai​ 个点&#xff0c;需要再连 n−1n-1n−1 条边&#xff0c;使其变成一棵树。 对一种连边方案&#xff0c;设原图中第 iii 个连通块连出了 did_idi​ 条边&#xff0c;那么这棵树 TTT 的价值为val(…