ACM知识竞赛 之 SDUT3037 让领导先走(拓扑排序)

来源:互联网 发布:淘宝网账号怎么申请 编辑:程序博客网 时间:2024/04/28 19:25

让领导先走

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 103 51 42 51 23 41 42 31 53 51 2

示例输出

1 2 3 4 5
后台数据太水,矩阵居然水过了。。。下面还是用邻接表吧
#include <iostream>#include <cstring>#include <cstdio>#include <string>#include <stdlib.h>#include <queue>#include <algorithm>using namespace std;#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <stack>#define inf 0x3f3f3f3fusing namespace std;struct node{    int x,y;} eg[100010],e[100010];struct no{    int x,y,next;}q[200010];int cmp(const void *a,const void *b){    struct node *aa=(struct node *)a;    struct node *bb=(struct node *)b;    if(aa->x!=bb->x)        return aa->x-bb->x;    else return aa->y-bb->y;}int n,m,tt,t;int v[30010],d[30010];int head[30010];void init(){    memset(head,-1,sizeof(head));    memset(v,0,sizeof(v));    memset(d,0,sizeof(d));    tt=0;    t=0;}void add(int xx,int yy){    q[t].x=xx;    q[t].y=yy;    q[t].next=head[xx];    head[xx]=t++;}int main(){    int flag;    while(scanf("%d%d",&n,&m)!=EOF)    {        init();        for(int i=0; i<m; i++)        scanf("%d%d",&eg[i].x,&eg[i].y);        qsort(eg,m,sizeof(eg[0]),cmp);        e[tt].x=eg[0].x;        e[tt++].y=eg[0].y;        for(int i=1; i<m; i++)        {            if(eg[i].x==eg[i-1].x && eg[i].y==eg[i-1].y)            ;            else            {                e[tt].x=eg[i].x;                e[tt++].y=eg[i].y;            }        }        for(int i=0;i<tt;i++)        {            add(e[i].x,e[i].y);            d[e[i].y]++;        }        flag=0;        for(int i=1; i<=n; i++)        {            for(int j=1; j<=n; j++)            {                if(v[j]==0&&d[j]==0)                {                    for(int k=head[j]; k!=-1; k=q[k].next)                            d[q[k].y]--;                    v[j]=1;                    if(flag==0)                    {                        printf("%d",j);                        flag=1;                    }                    else printf(" %d",j);                    break;                }            }        }        printf("\n");    }    return 0;}


0 0