迪杰斯特拉算法 源程序

本文介绍了一种使用C语言实现的迪杰斯特拉算法,该算法能够找到加权图中从一个起始顶点到其余各顶点的最短路径。通过定义图的数据结构并运用邻接矩阵来表示顶点之间的连接及其权重,该算法逐步确定了最短路径的顶点序列及路径长度。

/**********************迪杰斯特拉算法*********************************************/
#include <stdio.h>

#define INFINITY 10000
#define TRUE 1
#define FALSE 0
#define VERTEX_NUM 6


typedef struct Graph
{
char vexs[VERTEX_NUM]; /*顶点*/
int arcs[VERTEX_NUM][VERTEX_NUM]; /*邻接矩阵*/
int vexnum; /*顶点数*/
int arcnum; /*弧数*/
}Graph;


void ShortestPath(Graph g,int v0,int p[][VERTEX_NUM],int d[])
{
/*迪杰斯特拉算法求最短路径,g为图的邻接矩阵,v0为起始顶点,
p[v][w]储存v0到v路径上w的后继顶点(无后继置-1),d[v]为路径v0到v的带权长度*/
int v;
int w;
int min;
int i,j;
int final[VERTEX_NUM]; /*final[v]=TRUE当且仅当v属于S*/

/*初始化数组*/
for (v = 0; v < g.vexnum; v++)
{
final[v] = FALSE;
d[v] = g.arcs[v0][v];
for (w = 0; w < g.vexnum; w++)
{
p[v][w] = -1;
}
if (d[v] < INFINITY)
{
p[v][0] = v0;
p[v][1] = v;
}
}
/*初始化,顶点v0属于S集合*/
d[v0] = 0;
final[v0] = TRUE;
/*循环n-1次求最短路径*/
for (i = 1; i < g.vexnum; i++)
{
min=INFINITY;
for (w = 0; w<g.vexnum; w++)
{
if (!final[w]) /* w属于V-S */
{
if (d[w] < min)
{
/* w顶点离v0更近 */
v=w;
min=d[w];
}
}
}
final[v] = TRUE; /*离v0顶点最近的v加入S集*/
for (w = 0; w<g.vexnum; w++) /*更新当前最短路径及距离*/
{
if (!final[w] && (min+g.arcs[v][w] < d[w]) )
{
/*修改d[w]和p[w] (w属于V-S) */
d[w] = min + g.arcs[v][w];
for (j = 0; p[v][j]> -1 && j < VERTEX_NUM; j++)
{
p[w][j] = p[v][j]; /* p[w]=p[v] */
}
p[w][j] = w; /* p[w]=p[v]+w */
}
}
}
}


void main()
{
int i,
j;
Graph g;
int p[VERTEX_NUM][VERTEX_NUM];
int d[VERTEX_NUM];
int v0;

/*初始化图g*/
g.vexs[0]='A',g.vexs[1]='B',g.vexs[2]='C',g.vexs[3]='D',g.vexs[4]='E',g.vexs[5]='F';
for(i=0;i<VERTEX_NUM;i++)
for(j=0;j<VERTEX_NUM;j++)
g.arcs[i][j]=INFINITY;
g.arcs[0][2]=10,g.arcs[0][4]=30,g.arcs[0][5]=100,g.arcs[1][2]=5,
g.arcs[2][3]=50,g.arcs[3][5]=10,g.arcs[4][3]=20,g.arcs[4][5]=60;
g.vexnum=g.arcnum=VERTEX_NUM;

/*输出图的有关信息*/
for(i=0;i<VERTEX_NUM;i++)
{
printf("%c/t",g.vexs[i]);
for(j=0;j<VERTEX_NUM;j++)
{
printf("%5d ",g.arcs[i][j]);
}
printf("/n");
}
printf("/n");

/*求最短路径*/
v0 = 0;
ShortestPath(g,v0,p,d);

/*输出最短路径*/
for (i = 0; i < g.vexnum; i++)
{
printf("Path %c to %c:/n",g.vexs[v0],g.vexs[i]);
if ( p[i][v0] != -1 ) /*存在路径则输出*/
{
for (j = 0; p[i][j]!=-1; j++)
{
if (j != 0)
printf("→");
printf(" %c",g.vexs[p[i][j]]);
}
printf("/n");
}
printf("Length:%d/n",d[i]);
printf("/n");
}
}
/**********************迪杰斯特拉算法*********************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值