0
点赞
收藏
分享

微信扫一扫

topological-sort(拓扑排序)


在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:

  1. 每个顶点出现且只出现一次。
  2. 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。


对一个有向无环图进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。

算法

计算每个点的入度(有多少个点指向当前点)

入度为0的加入到拓扑序列中,并把它删除。删除后它指向的点的入度减1

重复上述过程,直到找不到入度为0的点或所有点到加入到了拓扑序列中

如果所有点加入到了拓扑序列中,拓扑排序完成

如果找不到入度为0的点,不存在拓扑序列

topological-sort(拓扑排序)_拓扑排序

topological-sort(拓扑排序)_拓扑排序_02

(注:图片来自博客 ​​拓扑排序(Topological Sorting)​​)


#include <stdio.h>
#include <memory.h>
#define MAXV 100
int map[MAXV][MAXV];//存放边的信息
int indegree[MAXV];//存放入度
void topo_sort(int n)
{
int i,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(indegree[j]==0)//当前入度为0
{
indegree[j]--;
printf("%d ",j);//输出,既从图中去除
for(k=1;k<=n;k++)
{
if(map[j][k]==1)
//它本来指向的顶点的入度减一
indegree[k]--;
}
break;
}
}
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);//n为顶点数,m为边数
memset(map,0,sizeof(map));
memset(indegree,0,sizeof(indegree));
int i;
int x,y;
for(i=0;i<m;i++)
{
scanf("%d %d",&x,&y);
if(!map[x][y])
{
map[x][y]=1;
indegree[y]++;
}
}
topo_sort(n);
return 0;
}



topological-sort(拓扑排序)_拓扑排序_03


举报

相关推荐

0 条评论