数据结构-最短路径

本文介绍了一种使用C语言实现迪杰斯特拉算法的方法,该算法用于寻找加权图中从一个起始顶点到其余各顶点的最短路径。通过构建图并输入顶点数、边数及权重,程序能够输出从指定顶点出发到达其他各顶点的最短路径及其长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构建图 ,求出v1与其他各个点的最短路径。

代码内容如下:

#include"stdio.h"
#include"stdlib.h"
#define INFINITY 10000000
#define MAX_VERTAX_NUM 6
#define FALSE 0
#define TRUE 1
//typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct ArcCell{
	int adj;
	int *info;
}ArcCell,AdjMatrix[MAX_VERTAX_NUM][MAX_VERTAX_NUM];
typedef struct{
	int vexs[MAX_VERTAX_NUM];
	AdjMatrix arcs;
	int vexnum,arcnum;
	//GraphKind kind;
}MGraph;
int D[6];
int path[6][6];
int final[6];

//**************图的表示方式--数组表示法************ 
void CreatDG(MGraph &G)
{
	int i,j,k,v1,v2,w;
	printf("请输入顶点数,边数:\n");
	scanf("%d%d",&G.vexnum,&G.arcnum);
	for(i=0;i<G.vexnum;i++) G.vexs[i]=i;
	for(i=0;i<G.vexnum;i++)
	  for(j=0;j<G.vexnum;j++)
	  {
	  	G.arcs[i][j].adj=INFINITY;
	  	G.arcs[i][j].info=NULL;
	  }	
	printf("输入每条边依附的两个顶点和这条边的大小:\n"); 
	for(k=0;k<G.arcnum;k++)
	{
		scanf("%d%d%d",&v1,&v2,&w);
		v1--;v2--; 
		G.arcs[v1][v2].adj=w;
	}
}
//****************迪杰斯特拉算法************************** 
void ShortestPath_DIJ(MGraph G,int v0)
{
	int w,v,i,min;
	for(v=0;v<G.vexnum;v++)
	{
		final[v]=FALSE;
		D[v]=G.arcs[v0][v].adj;
		for(w=0;w<G.vexnum;w++) path[v][w]=FALSE;
		if(D[v]<INFINITY) {
			path[v][v0]=TRUE; path[v][v]=TRUE;
		}
	}
	D[v0]=0;
	final[v0]=TRUE;
	for(i=1;i<G.vexnum;i++)
	{
		min=INFINITY;
		for(w=0;w<G.vexnum;w++)
		if(!final[w])
		if(D[w]<min) {
			v=w;min=D[w];
		}
		final[v]=TRUE;
		for(w=0;w<G.vexnum;w++)
		if(!final[w]&&(min+G.arcs[v][w].adj<D[w])){
			D[w]=min+G.arcs[v][w].adj;
			for(int j=0;j<G.vexnum;j++)
			path[w][j]=path[v][j]; 
			path[w][w]=TRUE;
		}
	}
}
int main()
{
	MGraph G;
	CreatDG(G);
	ShortestPath_DIJ(G,0);
	for(int i=0;i<G.vexnum;i++)
	{
		printf("v1到v%d的路径为:",i+1);
		for(int j=0;j<G.vexnum;j++)
		if(path[i][j]!=0) printf("%d  ",j+1); 
		printf("其长度为:");
		if(D[i]==INFINITY) printf("NULL \n");
		else  printf("%d  \n",D[i]);
	}
	printf("\n");
	return 0;
}

示例图:(A为v1,B为v2,C为v3,D为v4,E为v5,F为v6)


运行结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值