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

来源:互联网 发布:如何开淘宝店详细步骤 编辑:程序博客网 时间:2024/06/05 10:13

题目: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的度--;

找到排序。

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

在多做做题。

0 0
原创粉丝点击