首页 > 分享 > 【C语言】AOE网路径算法详解

【C语言】AOE网路径算法详解

【算法图例】

待更...

【算法核心思想】

【算法步骤】

【核心代码】

int TopSort(AGraph* g, int ve[], Stack* s1)

{

int i, j, k, n;

int s2[maxSize], top2 = -1;

ArcNode* p;

s1->top = -1;

n = 0;

for (i = 0; i < g->n; ++i)

{

if (g->adjlist[i].count == 0)

s2[++top2] = i;

ve[i] = 0;

}

if (top2 != 0)

{

printf("Fatal Error: Not is AOE");

return 0;

}

while (top2 != -1)

{

j = s2[top2--];

n++;

(s1->top)++;

s1->data[s1->top] = j;

p = g->adjlist[j].firstarc;

while (p != NULL)

{

k = p->adjvex;

(g->adjlist[k].count)--;

if (g->adjlist[k].count == 0)

s2[++top2] = k;

if (ve[j] + p->info > ve[k])

ve[k] = ve[j] + p->info;

p = p->nextarc;

}

}

if (n == g->n)

{

return 1;

}

else

{

printf("Fatal Error: Not is AOE");

return 0;

}

}

int CriticalPath(AGraph* g)

{

int ve[maxSize], vl[maxSize], e[maxSize], l[maxSize];

int i, j, k;

char tag;

ArcNode* p;

Stack s1;

if (!TopSort(g, ve, &s1))

return 0;

for (i = 0; i < g->n; ++i)

{

vl[i] = ve[g->n - 1];

}

while (s1.top != -1)

{

j = s1.data[s1.top];

(s1.top)--;

p = g->adjlist[j].firstarc;

while (p != NULL)

{

k = p->adjvex;

if (vl[k] - p->info < vl[j])

vl[j] = vl[k] - p->info;

p = p->nextarc;

}

}

j = 0;

for (i = 0; i < g->n; ++i)

{

p = g->adjlist[i].firstarc;

while (p != NULL)

{

k = p->adjvex;

e[j] = ve[i];

l[j] = vl[k] - p->info;

tag = (e[j] == l[j]) ? '*' : ' ';

printf("a%2d (%2d,%2d) %2d %2d %c n", j, i, k, e[j], l[j], tag);

j++;

p = p->nextarc;

}

}

return 1;

}

【算法测试】

测试数据:

来源:天勤210页 图7-27 AOE网

格式:

顶点数 边数

顶点号 顶点号 权值

11 15
0 1 3
0 2 4
1 3 2
1 4 1
2 4 3
2 5 5
3 6 6
4 6 8
4 7 4
5 8 2
6 10 7
7 8 10
7 9 4
8 9 1
9 10 6

测试代码:

#include <stdio.h>

#include <stdlib.h>

#define maxSize 100

typedef struct ArcNode

{

int adjvex;

int info;

struct ArcNode* nextarc;

}ArcNode;

typedef struct

{

int count;

ArcNode* firstarc;

}VNode;

typedef struct

{

VNode adjlist[maxSize];

int n, e;

}AGraph;

typedef struct

{

int data[maxSize];

int top;

}Stack;

FILE* fp;

void InsertEdge(AGraph* G, int v1, int v2, int w)

{

ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode));

p->adjvex = v2;

p->info = w;

p->nextarc = G->adjlist[v1].firstarc;

G->adjlist[v1].firstarc = p;

}

void CreateGraph(AGraph* G)

{

int nv, ne, i, v1, v2, w;

fp = fopen("C:CodeBlocksProjectAG.txt", "r");

fscanf(fp, "%d%d", &nv, &ne);

for (i = 0; i < nv; i++)

{

G->adjlist[i].firstarc = NULL;

}

for (i = 0; i < ne; ++i)

{

fscanf(fp, "%d%d%d", &v1, &v2, &w);

InsertEdge(G, v1, v2, w);

}

G->e = ne;

G->n = nv;

fclose(fp);

}

void GetIndegree(AGraph* g)

{

int i, j;

int c;

ArcNode* p;

for (i = 0; i < g->n; ++i)

{

c = 0;

for (j = 0; j < g->n; ++j)

{

if (i != j)

{

p = g->adjlist[j].firstarc;

while (p != NULL)

{

if (p->adjvex == i)

{

c++;

break;

}

p = p->nextarc;

}

}

}

g->adjlist[i].count = c;

}

}

int TopSort(AGraph* g, int ve[], Stack* s1)

{

int i, j, k, n;

int s2[maxSize], top2 = -1;

ArcNode* p;

s1->top = -1;

n = 0;

for (i = 0; i < g->n; ++i)

{

if (g->adjlist[i].count == 0)

s2[++top2] = i;

ve[i] = 0;

}

if (top2 != 0)

{

printf("Fatal Error: Not is AOE");

return 0;

}

while (top2 != -1)

{

j = s2[top2--];

n++;

(s1->top)++;

s1->data[s1->top] = j;

p = g->adjlist[j].firstarc;

while (p != NULL)

{

k = p->adjvex;

(g->adjlist[k].count)--;

if (g->adjlist[k].count == 0)

s2[++top2] = k;

if (ve[j] + p->info > ve[k])

ve[k] = ve[j] + p->info;

p = p->nextarc;

}

}

if (n == g->n)

{

return 1;

}

else

{

printf("Fatal Error: Not is AOE");

return 0;

}

}

int CriticalPath(AGraph* g)

{

int ve[maxSize], vl[maxSize], e[maxSize], l[maxSize];

int i, j, k;

char tag;

ArcNode* p;

Stack s1;

if (!TopSort(g, ve, &s1))

return 0;

for (i = 0; i < g->n; ++i)

{

vl[i] = ve[g->n - 1];

}

while (s1.top != -1)

{

j = s1.data[s1.top];

(s1.top)--;

p = g->adjlist[j].firstarc;

while (p != NULL)

{

k = p->adjvex;

if (vl[k] - p->info < vl[j])

vl[j] = vl[k] - p->info;

p = p->nextarc;

}

}

j = 0;

for (i = 0; i < g->n; ++i)

{

p = g->adjlist[i].firstarc;

while (p != NULL)

{

k = p->adjvex;

e[j] = ve[i];

l[j] = vl[k] - p->info;

tag = (e[j] == l[j]) ? '*' : ' ';

printf("a%2d (%2d,%2d) %2d %2d %c n", j, i, k, e[j], l[j], tag);

j++;

p = p->nextarc;

}

}

return 1;

}

int main()

{

AGraph G;

CreateGraph(&G);

GetIndegree(&G);

CriticalPath(&G);

return 0;

}

测试结果:

相关知识

加法接力赛C语言算法,C语言循环结构
基于递归神经网络算法的电子物流配送系统配送路径优化
用c语言写一朵最简单的花
一个简单的C语言程序(详解)
基于正余双弦自适应灰狼优化算法的医药物流配送路径规划
堪称最好最全的A*算法详解(译文)
【C语言】预处理(预编译)详解(上)(C语言最终篇)
C语言情人节玫瑰花代码
C语言:输出所有的水仙花数
物流配送路径规划模型及其改进TLBO算法研究

网址: 【C语言】AOE网路径算法详解 https://m.huajiangbk.com/newsview1074077.html

所属分类:花卉
上一篇: 版纳三月 柚子花开
下一篇: 花柚子とは?本柚子とどう違うのか