topological-sort(拓扑排序)

来源:互联网 发布:中文版木结构设计软件 编辑:程序博客网 时间:2024/05/17 08:22

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

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

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

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

算法

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

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

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

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

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



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


#include <stdio.h>#include <memory.h>#define MAXV 100int 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;}