这是我的第一道拓扑排序题~AC
拓扑排序实质上是一种广度优先遍历,由偏序确定全序。
首先遍历整个关系,找出入度为0的点 j ,然后删了 j,并且所有与j相邻的点的入度都减一。若最后没有节点剩余则说明拓扑排序成功,若最后还有节点剩余,但是找不出入度
为0的点,说明图中有环,则不可拓扑排序。
附上代码
#include <iostream>
using namespace std;
int map[550][550];
int indegree[550];
int main()
{
int n,m,a,b;
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
memset(indegree,0,sizeof(indegree));
for(int i=0;i<m;i++)
{
cin>>a>>b;
if(!map[a][b])
{
map[a][b]=1;
indegree[b]++;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(indegree[j]==0)
{
indegree[j]--;
if(i==n)cout<<j<<endl;
else cout<<j<<" ";
for(int k=1;k<=n;k++)
{
if(map[j][k])
indegree[k]--;
}
break;
}
}
}
}
return 0;
}