topological-sort(拓扑排序)

在图论中,拓扑排序(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-sort(拓扑排序)_第1张图片

topological-sort(拓扑排序)_第2张图片

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


#include 
#include 
#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

topological-sort(拓扑排序)_第3张图片

你可能感兴趣的:(topological-sort(拓扑排序))