Dijkstra算法求最短路径


```c
#include<stdio.h>
#define max 100;
#define MAX_VERTEX_NUM 20
#define FALSE 0
#define TRUE 1
typedef struct ArcCell{
	int adj;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
	char vexs[MAX_VERTEX_NUM];
	AdjMatrix arcs;
	int vexnum,arcnum;
}MGraph;
void ShortestPath_DIJ(MGraph G,int v0)
{
	int final[MAX_VERTEX_NUM];
	int D[MAX_VERTEX_NUM];
	int length[MAX_VERTEX_NUM];
	int i=0;
	int min=0;
	int w=0;
	int v=0;
	length[0]=0;
	for(i=0;i<G.vexnum;i++)
	{
		final[i]=FALSE;
		D[i]=G.arcs[v0][i].adj;
	}
	D[v0]=0;final[v0]=TRUE;
	for(i=1;i<G.vexnum;i++)
	{
		min=max;
		for(w=0;w<G.vexnum;w++)
		{
			if(final[w]==FALSE)
			{
				if(D[w]<min)
				{
					v=w;
					min=D[w];
				}
			}
		}
		final[v]=TRUE;
		for(w=0;w<G.vexnum;w++)
		{
			if(final[w]==FALSE&&(min+G.arcs[v][w].adj<D[w]))
			{
				D[w]=min+G.arcs[v][w].adj;
				
			}
		}
		length[i]=D[i];
		printf("顶点%c到顶点%c的最短路径长度为%d\n",G.vexs[v0],G.vexs[v],length[i]);
	}	
}
int main(void)
{
	MGraph G;
	int i,j;
	int n;
	char m;
	printf("请输入有向图顶点的个数:\n");
	scanf("%d",&n);
	G.vexnum=n;
	for(i=0;i<G.vexnum;i++)
	{
		printf("请输入有向图第%d个顶点的名称:\n",i);
	    getchar();
		scanf("%c",&G.vexs[i]);
		printf("请输入顶点%c到每个顶点间的距离\n",G.vexs[i]);
    	for(j=0;j<G.vexnum;j++)
    	{
    		scanf("%d",&G.arcs[i][j].adj);
    	}		
    }
	ShortestPath_DIJ(G,0);	
}

发布了37 篇原创文章 · 获赞 19 · 访问量 845

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/103558303