杭电1258--确定比赛名次(拓扑排序…

来源:互联网 发布:windows vista premium 编辑:程序博客网 时间:2024/04/29 13:09
ProblemDescription
有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。
Input
输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。
Output
给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。
其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。
Sample Input
4 3
1 2
2 3
4 3
SampleOutput
1 2 4 3
/////////////////////////////////////////////////////////////////
 
一个简单的拓扑排序算法就是:找出一个没有入边的点,然后我们显示出该顶点,并将它和它的边一起从图中删除,然后我们对图的其余部分用同样的方法处理,所得到的序列就是拓扑排序!!
 
涉及图的存储和队列运用

# include<stdio.h>

# include<string.h>

# include<stdlib.h>

int map[505][505];

int n,head,tail,a[505],mark[505],queue[1000];

void Inqueue()//找到入度为0的点

{

      int i,j,k,flag;

      k=0;

      for(i=1;i<=n;i++)

      {

             if(mark[i]==0)

             {

                    flag=0;

                    for(j=1;j<=n;j++)

                    {

                           if(map[j][i])

                           {

                                  flag=1;

                                  break;

                           }

                    }

                    if(flag==0)

                    {

                           queue[tail++]=i;

                           mark[i]=1;

                           return ;

                       

             }

      }

      return ;

}

void Change(int i)//删除从该点出发的边

{

      int j;

      for(j=1;j<=n;j++)

             if(map[i][j])

                    map[i][j]=0;

             return ;

}

int main()

{

      int i,m,x,y;

      while(scanf("%d%d",&n,&m)!=EOF)

      {

             memset(map,0,sizeof(map));

             memset(mark,0,sizeof(mark));

             for(i=0;i<m;i++)

             {

                    scanf("%d%d",&x,&y);

                    if(map[x][y]==0)

                           map[x][y]=1;

             }

             head=tail=0;

             Inqueue();

             while(head<tail)

             {

                    a[head]=queue[head];

                    Change(a[head]);

                    head++;

                    Inqueue();

             }

             printf("%d",a[0]);

             for(i=1;i<n;i++)

                    printf(" %d",a[i]);

             printf("\n");

      }

      return 0;

}

0 0