♥ 有错误请指出哟~
*1、定义:
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。
即:按照 图中各点 出现的先后顺序排列
*
*2.步骤:
(1) 选择一个入度为0的顶点并输出;
(2) 从图中删除此点及其所有出边,即该点及所有与该点相邻的点的入度-1。
循环结束后,若输出的顶点数小于网中的顶点数,即图不空,则输出“有回路”信息,否则输出的序列就是一种拓扑序列。
*
*3.代码实现
//找入度为零的边
#include<iostream>
#include<cstring>
#define maxx 105
using namespace std;
int n,m,indegree[maxx],mapp[maxx][maxx],x,y;
void toposort(int in[maxx],int a[maxx][maxx],int mm)
{
//入度-- ≈ 删边,∴要保证有边可删,∴循环m次
for(int i=1;i<=mm;i++)
{
for(int j=1;j<=mm;j++)
{
if(in[j] == 0)
{
in[j]--;
cout<<j;
for(int k=1;k<=mm;k++)
{
if(a[j][k] == 1)
{
in[k]--;
}
}
}
}
}
}
int main()
{
cin>>n>>m;
memset(mapp,0,sizeof(mapp));
memset(indegree,0,sizeof(indegree));
for(int i=1;i<=n;i++)
{
cin>>x>>y;//x与y相邻
mapp[x][y]=1;
indegree[y]++;
}
toposort(indegree,mapp,m);
return 0;
}