HUD1285 确定比赛名次 拓扑排序

来源:互联网 发布:厦门软件测试工资待遇 编辑:程序博客网 时间:2024/05/16 14:59

题目大意:输入每两人间的先后关系,让你确定出一个序号最小的排名。

注意这里不属于无前驱顶点优先的拓扑排序,这点由样例就可以看出,如果是按无前驱顶点优先的话,那么对于 1 2,2 3,4 3这样的输入,结果应该是 1 4 2 3 的,按最

小序号输出才是1 2 4 3。我们可以考虑用邻接矩阵来存储图,这样直接按自然序遍历就行了。

代码如下:

#include <cstdio>#include <cstring>using namespace std;int map[501][501];bool s[501];int ind[501];int num;void Top_sort(int n){    while(num<n)    {        int i;        for(i=1;i<=n;i++)          if(ind[i]==0&&s[i])            break;        s[i]=false;        if(num) printf(" ");        printf("%d",i);        num++;        for(int j=1;j<=n;j++)          if(map[i][j])            ind[j]--;    }}int main(){    int n,m;    int a,b;    while(scanf("%d%d",&n,&m)!=-1)    {        memset(map,0,sizeof(map));        memset(ind,0,sizeof(ind));        memset(s,true,sizeof(s));        for(int i=1;i<=m;i++)        {            scanf("%d%d",&a,&b);            if(!map[a][b]) ind[b]++;            map[a][b]=1;        }        num=0;        Top_sort(n);        printf("\n");    }    return 0;}


0 0
原创粉丝点击