题目
在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting)。
(1)每个顶点出现且只出现一次;
(2)若A在序列中排在B的前面,则在图中不存在从B到A的路径。
也可以定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。
基本思想:
-
先把入度为0 的节点找到并打印
-
删掉入度为0的节点,继续循环1的步骤,直至图为null。
简而言之,就是将有确定的先后顺序的图的各个顶点排序输出。
代码如下
#include<bits/stdc++.h>
using namespace std;
const int maxn=101;
int adj[maxn][maxn],indegree[maxn],n,m;
stack<int>s;
void CreatGraph()
{
memset(adj,0,sizeof(adj));
memset(indegree,0,sizeof(indegree));
int u,v;
while(m--)
{
cin>>u>>v;
adj[u][v]=1;
indegree[v]++;
}
for(int i=1;i<=n;i++)
{
if(!indegree[i])
s.push(i);
}
}
void tpSort()
{
int order[n+5];
int cnt=0;
int it;
while(!s.empty())
{
it=s.top();
s.pop();
for(int i=1;i<=n;i++)
{
if(adj[it][i]&&indegree[i])
indegree[i]--;
if(adj[it][i]&&!indegree[i])
s.push(i);
}
order[cnt++]=it;
}
for(int i=0;i<n;i++)
cout<<order[i]<<" ";
cout<<endl;
}
int main()
{
while(cin>>n>>m&&n)
{
CreatGraph();
tpSort();
}
}