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

来源:互联网 发布:淘宝店铺客户流失分析 编辑:程序博客网 时间:2024/05/01 00:49

函数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;

AOE网
AOE网
AOE网邻间表存储结构
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*/
阅读全文
0 0
原创粉丝点击