找到入度为0的顶点,入队,删除它和它的出度,重复操作;如果我删除的顶点数小于我输入的顶点数,则有向图中有回路,排序失败。
##include<cstdio>
#include<vector>
#include<queue>
using namespace std;
vector<int>a[100];
int indegree[100];
queue<int>q;
int n,m;
void addcin(int u,int v)
{
a[u].push_back(v);
indegree[v]++;//入度
}
bool TopologicalSort()
{
for(int i=0;i<n;i++)
{
if(indegree[i]==0)
{
q.push(i);
}
}
int cot=0;
//重复操作
while(!q.empty())
{
int o=q.front();
q.pop();
printf("%d ",o);
cot++;
vector<int>::iterator it = a[o].begin();
for(;it!=a[o].end();it++)
{
if(!(--indegree[*it]))
{
q.push(*it);
}
}
}
if(cot<n)
{
return false;
}
else
{
return true;
}
}
int main()
{
int u,v;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i=0;i<m;i++)
{
scanf("%d %d",&u,&v);
addcin(u,v);
}
TopologicalSort();
printf("\n");
}
}