图的顶点的拓扑排序,返回关键路径长度

函数int Toplogical(LinkedWDigraph G)的功能是对图G中的顶点进行拓扑排序,并返回关键路径的长度。其中图G表示一个具有n个顶点的AOE网,图中顶点从1~n依次编号,图G的存储结构采用邻接表表示,其数据类型定义如下:


typedef struct Gnode {
    int adjvex;//邻间节点的编号
    int weight;//弧上的权值
    struct Gnode *nextarc;//指向下一个弧的节点
}Gnode;

typedef struct Adjlist {//邻接表的头结点类型
    char vdata;//顶点的数据信息
    struct Gnode *firstadj;//指向邻接表的第一个表节点
}Adjulist;

typedef struct LinledWDigraph {//图的类型
    int n, e;//图中顶点的个数和边数
    struct Adjlist *head;//指向图中第一个顶点的邻接表的头节
}LinkedWDigraph;

图的顶点的拓扑排序,返回关键路径长度_第1张图片
AOE网
图的顶点的拓扑排序,返回关键路径长度_第2张图片
AOE网邻间表存储结构

Toplogical(LinkedWDigraph G)函数的具体实现如下。

int Toplogical(LinkedWDigraph G)
{
    Gnode *p;
    int j, w, top =0 ;
    int *Stack, *ve, *indegree;

    ve = (int *)malloc((G.n + 1) * sizeof(int));
    indegree = (int *)malloc((G.n + 1) * sizeof(int));//存储网中各顶点的入度
    Stack = (int *)malloc((G.n + 1) * sizeof(int));//存储入度为0的定点的编号

    if (!ve || !Stack || !indegree)
        printf("!!!!FALSE!!!!");

    for (j = 1; j <= G.n; j++){//初始化
        ve[j] = 0; indegree[j] = 0;
    }

    for (j = 0; j <= G.n; j++){//求网中各顶点的入度
        p = G.head[j].firstadj;
        while (p){
            indegree[p->adjvex]++;
            p = p->nextarc;
        }/*while*/
    }/*for*/

    for (int j = 0; j <= G.n; j++){
        if (!indegree[j])
            Stack[++top] = j;
        while (top > 0){
            w = Stack[top--];
            printf("%c", G.head[w].vdata);
            p = G.head[w].firstadj;
            while (p){
                indegree[p->adjvex]--;
                if (!indegree[p->adjvex])
                    Stack[++top] = p->adjvex;
                if (ve[w]+p->weight>ve[p->adjvex])
                    ve[p->adjvex] = ve[w] + p->weight;
                p = p->nextarc;
            }/*while*/
        }/*whlie*/
    }
    return ve[w];
}/*Toplogical*/

你可能感兴趣的:(计算机网络)