您的位置:首页 > 其它

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

2017-11-07 17:59 148 查看
函数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网邻间表存储结构

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*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 typedef