Topological Sort(拓扑排序)

Application object: 有向无环图(Directed Acyclic Graph简称DAG)

AOV网:在表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,即AOV网(Activity On Vertex Network)

拓扑序列(Topological Order):设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,......,vn,满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必须在顶点vj之前,如此顶点序列。

若此网输出全部顶点,则说明它不存在环(回路)的AOV网;反之存在环(回路),不是AOV网

基本思路:AOV网中选择入度为0的顶点输出,然后删除输出的顶点,并删除此顶点为尾的弧,继续重复此不舟,直到所有顶点被输出或AOV网中不存在入度为0的顶点为止。

例:

创建邻接表: in | data | firstedge -> adjvex | next

Code:

typedef struct EdgeNode

{

    int adjvex;

    int weight;

    struct EdgeNode *next;

}EdgeNode;

typedef struct VertextNode

{

    int in;

    int data;

    EdgeNode *firstedge;

}VertexNode,AdjList[MAXVEX];

typedef struct

{

    AdjList adjList;

    int numVertexes,numEdges;

}graphAdjList,*GraphAdjList;


Status TopologicalSort(GraphAdjList GL)

{

    EdgeNode *e;

    int i,k,gettop;

    int top=0;

    int count = 0;

    int *stack;

    stack = (int *)malloc(GL->numVertexes * sizeof(int));

    for(i = 0; i<GL->numVertexes; i++)

        if(GL->adjList[i].in == 0)

            stack[++top] = i;

    while(top != 0)

    {

        gettop = stack[top--];

        printf("%d -> ",GL->adjList[gettop].data);

        count++;

        for(e = GL->adjList[gettop].firstedge; e; e=e->next)

        {

            k = e->adjvex;

            if(!(--GL->adjList[k].in))

                stack[++top] = k;

        }

    }

    if(count < GL->numVertexes)

        return ERROR;

    else

        return OK;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 图的定义与术语 1、图按照有无方向分为无向图和有向图。无向图由顶点和边构成,有向图由顶点和弧构成。弧有弧尾和弧头之...
    unravelW阅读 435评论 0 0
  • 链接:https://vjudge.net/problem/Aizu-GRL_4_B下面基于bfs和dfs分别进行...
    kimoyami阅读 792评论 0 0
  • From 9章算法: Here, visited boolean array表示下图里的set。 https://...
    98Future阅读 347评论 0 0
  • #include #include <stdio.h> #include #include<cstdlib> us...
    天线斑斑阅读 323评论 0 0
  • VisuAlgo!一,Date Structure的核心技术是分解和抽象二,基本概念和常用术语 三,逻辑结构1,逻...
    斜杠青年许晏铭阅读 935评论 0 0