码迷,mamicode.com
首页 > 编程语言 > 详细

拓补排序

时间:2014-12-05 10:25:30      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   io   os   sp   for   on   数据   

让领导先走

 

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

题目描述

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

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

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

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

输入

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


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

输出

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

 

示例输入

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();

    }
}

  

拓补排序

标签:des   style   blog   io   os   sp   for   on   数据   

原文地址:http://www.cnblogs.com/myhlbl/p/4145946.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!