HDU 1285 确定比赛名次 (拓扑排序)

题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105916#problem/F

代码:

#include<stdio.h>
#include<string.h>

using namespace std;

int degree[505],res[505];
bool maps[505][505];
int n,m;

void topo()
{
    int p;
    for(int i=1;i<=n;i++)
    {
        p=-1;
        for(int j=1;j<=n;j++)
        {
            if(degree[j]==0)
            {
                degree[j]--;
                res[i]=p=j;
                break;
            }
        }

        for(int j=1;j<=n;j++)
        {
            if(maps[p][j]==true)
            {
                maps[p][j]=false;
                degree[j]--;
            }
        }
    }
}
void output()
{
    for(int i=1;i<n;i++)
    {
        printf("%d ",res[i]);
    }
    printf("%d\n",res[n]);
}

int main()
{
    int i,x,y;
    while(~scanf("%d %d",&n,&m))
    {
        memset(maps,false,sizeof(maps));
        memset(degree,0,sizeof(degree));
        memset(res,0,sizeof(res));

        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            if(maps[x][y]==false)
            {
                maps[x][y]=true;
                degree[y]++;
            }
        }
        topo();
        output();
    }
}

对 有向不成环 的图 排成 按规律排成线性。

思路:

输入图,每次对图的出度++,for(i->n)找每个答案;

找出度为0的,在找这种情况下的 x ,每次对存在第一个坐标x的度--;

找到排序。

网上说这是非常简单的拓扑排序。一般的都用邻接表来存。

在多做做题。

你可能感兴趣的:(HDU 1285 确定比赛名次 (拓扑排序))