拓补排序

让领导先走

Time Limit: 2000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

完啦完啦,公司里发火灾拉,大家快跑啊,再不跑就没命啦。大家不要乱,请按顺序通过消防通道,说到顺序,那么问题来了。

按照中国特色社会主义文化,我们严格贯彻落实一件事,那就是,让领导先走。

现在又n人,从1标号到n。如果a是b的领导的话,就必须让a排在b的前面。

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

输入

多组输入,然后对于每个测试数据,第一行有两个整数n(1 <= n <= 30000)和m(1 <= m <= 100000),分别表示人数和上下级存在数。

然后m行,每行两个整数a和b,表示有一个a是b的领导。a和b必然不同。

输出

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

示例输入

5 10
3 5
1 4
2 5
1 2
3 4
1 4
2 3
1 5
3 5
1 2

示例输出

1 2 3 4 5
#include<iostream>
#include<string.h>
using namespace std;
int map[22000][22000];
int in[30005];
int s[30005],n,m;
void tuobu()
{
    int i,j,k=0;
    for(i=1;i<=n;i++)
    {
        if(in[i]==0)
        {s[k++]=i;
        in[i]--;
        for(j=1;j<=n;j++)
        {
            if(map[i][j]==0)
            {
                in[j]--;
            }
        }
        }
    }
    for(i=0;i<k;i++)
    {
        if(i==0)
        cout<<s[i];
        else
        cout<<" "<<s[i];

    }
cout<<endl;
}
int main()
{
    int i,j,k;
    while(cin>>n>>m)
    {
        int x,y;
        for(i=1;i<=n;i++)
        in[i]=0;
        for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        map[i][j]=-1;
        for(i=0;i<m;i++)
        {cin>>x>>y;
        if(map[x][y]==-1)
        {
            in[y]++;
            map[x][y]=0;
        }

        }
        tuobu();

    }
}

  

时间: 2024-08-06 10:46:16

拓补排序的相关文章

【BZOJ3036】绿豆蛙的归宿 拓补排序+概率

[BZOJ3036]绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度.绿豆蛙从起点出发,走向终点.到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K .现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少? Input 第一行: 两个整数 N M,代表图中有N个点.M条边第二行到第 1+M 行: 每

【BZOJ2815】[ZJOI2012]灾难 拓补排序+LCA

[BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物的阿米巴告诉小强,草原是一个极其稳定的生态系统.如果蚂蚱灭绝了,小鸟照样可以吃别的虫子,所以一个物种的灭绝并不一定会引发重大的灾难. 我们现在从专业一点的角度来看这个问题.我们用一种叫做食物网的有向图来描述生物之间的关系: 一个食物网有N个点,代表N种生物,如果生物

HDU4324 - Triangle LOVE 拓补排序

HDU4324 - Triangle LOVE : http://acm.showproblemhdu.edu.cn/.php?pid=4324 标准的拓补排序,上代码 : #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 2010; int In[MAXN]; char Map[MAXN][MAXN]; int T,N; int

HDU5154 - Harry and Magical Computer 拓补排序

HDU5154 - Harry and Magical Computer : http://acm.hdu.edu.cn/showproblem.php?pid=5154 还是拓补排序,直接上代码了. #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int MAXN = 105; int Map[MAXN]

poj 3687 Labeling Balls(拓补排序)

Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them with 1 to N in such a way that: No two balls share the same label. The labeling satisfies several constrains like "The ball labeled with a is lighter

poj 1094 Sorting It All Out 拓补排序

Description An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D.

ZOJ Problem Set - 3795(缩点拓补)

题意:每条信息说明了两个一定不在一个集合里的人,求最少情况集合可以划分为多少子集. 一看就是拓补树的最高层数,但题意中隐含了可能有环(>=关系偏序),所以要先缩点,再拓补.当然,缩点之后图中没有环,直接dfs记忆化也是ok的. 代码: #include<iostream> #include<cstdio> #include<cmath> #include<map> #include<queue> #include<vector>

拓拔排序算法

一.定义: 拓扑排序是对有向无回路图(DAG)顶点的一种排序,它使得如果存在从u到v的有向路径,那么满足序列中u在v前. 例如:(来自于某牛) 最后变成 所以我们的算法可以描述为这样一个过程: 1.找到整个图中所有的原点,将这些点压进队列(栈)中 2.从队列(栈)中取出一点,输出,将该点及它的边删除,找到它所指向的点,如果改点是一个原点(删除指向它的点后),则压入队列(栈) 3.重复2过程,直到它为空 应用: 1.判断有向图中是否存在回路.如果无法构成拓扑序列,那么图中存在环. 2.如果一个事件

hdoj 3342 Legal or Not 【拓朴排序】

Legal or Not Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O hers) Total Submission(s): 6078    Accepted Submission(s): 2824 Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is