两种类型依情况使用,多数使用第二种dfs
#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;
}
}
vector<int>g[N];//邻接表存储
int vis[N],topo[N],cnt;
bool dfs(int u)
{
vis[u] = -1;//-1用来表示顶点u正在访问
for(int i = 0 ; i < g[u].size() ; i ++)
{
if(vis[g[u][i]] == -1)//表示这个点进入了两次,肯定出现了环
return false;
else if(vis[g[u][i]] == 0)
{
dfs(g[u][i]);
}
}
vis[u] = 1;
topo[cnt++] = u;//放到结果数组里,输出的时候记得倒序输出,(回溯的原因)
return true;
}
bool toposort(int n)
{
memset(vis,0,sizeof(vis));
for(int i = 1 ; i <= n ; i ++)
{
if(!vis[i])
{
if(!dfs(i)) return false;//huan
}
}
return true;
}