一种拓扑排序算法。该算法是简单而直观的,实质上属于广度优先遍历,因此称为广度优先拓扑排序算法。该算法包含下列几个步骤:
[1] 从有向图中找一个没有前趋的结点v,若v不存在,则表明不可进行拓扑排序(图中有环路),结束(不完全成功);
[2] 将v输出;
[3] 将v从图中删除,同时删除关联于v的所有的边
[4] 若图中全部结点均已输出,则结束(成功),否则转[1]继续进行
下面以杭电1285这道题目为例写出模板:点击打开链接
#include <iostream>
using namespace std;
int map[502][502], indegree[502], m, n, pur[502];
void topsort()
{
int i, j, k=1;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(indegree[j]==0)
{
indegree[j]--;
pur[k++] = j;
for(int x=1; x<=n; x++)
if(map[j][x])
indegree[x]--;
break;
}
if(j>n)
{
cout<<"存在环"<<endl;
return ;
}
}
}
}
void main()
{
int i, j;
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
memset(indegree,0,sizeof(indegree));
int a, b;
for(i=1; i<=m; i++)
{
cin>>a>>b;
if(!map[a][b])
{
map[a][b] = 1;
indegree[b]++;
}
}
topsort();
for(i=1; i<=n; i++)
if(i!=n)
cout<<pur[i]<<" ";
else
cout<<pur[i]<<endl;
}
}