来源:点击打开链接
做完这道题,可以对无环图的拓扑排序有所了解。
无前驱的顶点优先的拓扑算法主要分为三步:
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;
}