请用c语言编程求图的最短路径,图的应用----最短路径(C语言+&引用)

test.cpp

#define _CRT_SECURE_N0_WARNINGS 1

#pragma warning (disable:4996)

# include

# include

using namespace std;

# define MAX_LENGTH 1024

# define MAX_VERTEX_NUM 20

# define FALSE 0

# define TRUE 1

typedef enum{

DG, DN, UDG, UDN

} GraphKind;

typedef int VRType;

typedef int InfoType;

typedef int VertexType;

typedef int PathMatrix;

typedef int ShortPathTable;

typedef struct ArcCell

{

VRType adj;

InfoType info;

}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct

{

VertexType vexs[MAX_VERTEX_NUM];

AdjMatrix arcs;

int vexnum, arcnum;

GraphKind kind;

}MGraph;

int CreateDN(MGraph &G) //构建有向网G

{

int i = 0, j = 0, k, vi, vj, w;

printf("请输入有向网的顶点数:");

scanf("%d", &G.vexnum);

printf("请输入有向网的弧数:");

scanf("%d", &G.arcnum);

for (i = 0; i < G.vexnum; ++i)

for (j = 0; j < G.vexnum; ++j)

{

G.arcs[i][j].info = MAX_LENGTH;

}

printf("请输入每一条边依附的顶点及权值-->\n");

for (k = 0; k < G.arcnum; ++k)

{

printf("第%d条边的vi:", k + 1);

scanf("%d", &vi);

printf("第%d条边的vj:", k + 1);

scanf("%d", &vj);

printf("第%d条边的权值:", k + 1);

scanf("%d", &w);

//检验顶点和该边权值的合法性

i = vi;

j = vj;

while (i<0 || i>G.vexnum - 1 || j<0 || j>G.vexnum - 1 || w < 0 || w >= MAX_LENGTH)

{

printf("输入非法!\n");

printf("请重新输入-->\n");

printf("第%d条边的vi:", k + 1);

scanf("%d", &vi);

printf("第%d条边的vj:", k + 1);

scanf("%d", &vj);

printf("第%d条边的权值:", k + 1);

scanf("%d", &w);

i = vi;

j = vj;

}

G.arcs[i][j].info = w;

}

return true;

}

void PrintDN(MGraph G)

{

printf("---------------------------------------\n");

printf("顶点 ");

for (int i = 0; i

printf("%5d", i);

printf("\n");

for (int i = 0; i

{

printf("%5d ", i);

for (int j = 0; j

printf("%5d", G.arcs[i][j].info);

printf("\n");

}

printf("---------------------------------------\n");

}

void ShortestPath_DIJ(MGraph G, int v0, PathMatrix Path[MAX_VERTEX_NUM][MAX_VERTEX_NUM], ShortPathTable Dist[MAX_VERTEX_NUM])

{

int i, j, v, w, min, final[MAX_VERTEX_NUM];

for (v = 0; v

{

final[v] = FALSE;

Dist[v] = G.arcs[v0][v].info;

for (w = 0; w

Path[v][w] = FALSE;

if (Dist[v]

{

Path[v][v0] = TRUE;

Path[v][v] = TRUE;

}

}

Dist[v0] = 0;

final[v0] = TRUE;

printf("顶点 ");

for (i = 0; i

printf("%5d", i);

printf("\n");

printf("Step %d :", v0 + 1);

for (i = 0; i

printf("%5d", Dist[i]);

printf("\n");

for (i = 1; i

{

min = MAX_LENGTH;

for (w = 0; w

if (!final[w])

if (Dist[w]

{

v = w;

min = Dist[w];

}

final[v] = TRUE;

for (w = 0; w < G.vexnum; ++w)

{

printf("%d ", final[w]);

}

printf("\nStep %d :", i+1);

for (w = 0; w

{

if (!final[w] && (min + G.arcs[v][w].info

{

Dist[w] = min + G.arcs[v][w].info;

for (j = 0; j

Path[w][j] = Path[v][j];

Path[w][w] = TRUE;

}

printf("%5d", Dist[w]);

}

printf("\n");

}

for (w = 0; w < G.vexnum; ++w)

{

printf("%d ", final[w]);

}

printf("\n---------------------------------------\n");

}

void main()

{

MGraph G;

int v0 = 0;

PathMatrix Path[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

ShortPathTable Dist[MAX_VERTEX_NUM];

printf("------从某个源点到其余各顶点的最短路径----迪杰斯特拉算法------\n");

printf("\n");

if (CreateDN(G))

printf("\n构建有向网G成功!\n");

printf("\n有向网G的带权邻接矩阵:\n");

PrintDN(G);

ShortestPath_DIJ(G, v0, Path, Dist);

}

99baeb503dd7

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值