相比邻接矩阵,邻接表的拓扑排序麻烦在判断重边上,但邻接表节省内存和时间,是一个很不错的方法。
#include <iostream>
#include <string.h>
using namespace std;
int u[1100],v[1100],indegree[510],first[1100],next0[1100];
int main()
{
int n,m;
while(cin>>n>>m)
{
memset(first,-1,sizeof(first));
memset(indegree,0,sizeof(indegree));
memset(next0,-1,sizeof(next0));
for(int i=1;i<=m;i++)
{
cin>>u[i]>>v[i];
int x=first[u[i]],flag=0;
//判断是否有重边
while(x!=-1)
{
if(v[x]==v[i])
{
flag=1;
break;
}
x=next0[x];
}
if(flag==0)
{
next0[i]=first[u[i]];
first[u[i]]=i;
indegree[v[i]]++;
}
}
//简单的拓扑排序
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<<" ";
else
cout<<j<<endl;
for(int k=first[j];k!=-1;k=next0[k])
{
indegree[v[k]]--;
}
break;
}
}
}
}
return 0;
}