首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【拓扑排序】HDU 1285——确定赛事名次

2013-09-07 
【拓扑排序】HDU 1285——确定比赛名次来源:点击打开链接做完这道题,可以对无环图的拓扑排序有所了解。无前驱的

【拓扑排序】HDU 1285——确定比赛名次

来源:点击打开链接

做完这道题,可以对无环图的拓扑排序有所了解。

无前驱的顶点优先的拓扑算法主要分为三步:

1、找到一个入度为0的顶点并且输出之。

2、在图中删除该顶点,并且删除与该顶点有关的边。

3、重复步骤(1)(2),直到剩余的网中不存在没有前驱的顶点。

这个题点集比较集中,可以采用邻接矩阵的形式。

#include <iostream>#include <cstring>#include <iostream>using namespace std;int mat[505][505];int indegree[505];int ans[505];int main(){    int length,match;    while(cin>>length>>match)    {        memset(ans,0,sizeof(ans));        memset(indegree,0,sizeof(indegree));        memset(mat,0,sizeof(mat));        int x,y;        for(int i=0;i<match;i++)        {            cin>>x>>y;            mat[x][y]=1;        }        for(int i=1;i<=length;i++)        {            for(int j=1;j<=length;j++)            {                if(mat[i][j])                   indegree[j]++;            }        }        for(int i=1; i<=length; i++)        {            int k=1;            while(indegree[k]!=0)                k++;              ans[i]=k;            indegree[k]--;//更新为-1,后边检测时不受影响            for(int j=1; j<=length; j++)                if(mat[k][j])                     indegree[j]--;//相关联的入度减1        }                for(int i=1;i<length;i++)            cout<<ans[i]<<" ";           cout<<ans[length]<<endl;            }        return 0;}



热点排行