Dijkstra算法求单源最短路径

1. 代码

/*
Dijkstra算法求单源最短路径 
*/ 
#include<stdio.h>
#include<stdlib.h>
#define VEXSIZE 100 
//建立邻接矩阵 
int creat(int cost[][VEXSIZE])
{
	int vexnum, edgnum;
	int v1, v2, w;
	int i, j;

	printf("输入顶点数和边数:\nvexnum,edgnum=");
	scanf("%d,%d", &vexnum, &edgnum);
	for(i=1;i<=vexnum;i++)
		for(j=1;j<=vexnum;j++)
		cost[i][j]=32767;			//代表无穷 
		
	printf("输入边的起点,终点,权:\n");	
	for(i=1;i<=edgnum;i++)
	{
		printf("v1,v2,w= ");
		scanf("%d,%d,%d", &v1, &v2, &w);		
		cost[v1][v2]=w;		 
	}
	return vexnum;
}
//Dijkstra算法 
void Dijkstra(int cost[][VEXSIZE], int vexnum)
{
	int v1;
	int i, j;	
	//dist[i]存储 c1-vi的距离;path[i]存储直接前驱 ;s[]=1,0表示已,未找到最短路径 
	int dist[vexnum+1], path[vexnum+1], s[vexnum+1];
	printf("输入源点:\n");
	scanf("%d", &v1); 
	//初始化各数组 
	for(i=1;i<=vexnum;i++)
	{
		dist[i]=cost[v1][i];
		s[i]=0;
		if(dist[i]<32767)
			path[i]=v1;	 
	}	
	s[v1]=1;
//每次循坏,目的是找到一个顶点的最短路径(使某个s[i]=1 )并存储在dist[i] 
	for(i=1;i<=vexnum;i++)
	{
		//if(i==v1)
		//	continue; 
		int min, locmin;
		min=32767;
		//每次循坏,目的是寻找最小dist[]及其位置(对应顶点)
		for(j=1;j<=vexnum;j++)
		{
			if(s[j]==0 && min>dist[j])
			{
				min=dist[j];
				locmin=j;
			}
		} 
	 
		s[locmin]=1;			//加入顶点locmin 
		//dist[locmin]=min; 		/*在上面循环中已经实现,加上会出现莫名其妙的错误*/
		
		//path[]默认v1, 此处不必修改 
		
		//locmin加入后,修改dist[],path[] 
		for(j=1;j<=vexnum;j++)
			if(s[j]==0 && dist[locmin]+cost[locmin][j]<dist[j])
			{
				dist[j]=dist[locmin]+cost[locmin][j];
				path[j]=locmin;	
			}
			
	}
	//输出每一顶点的最短路径 
	printf("输出Dijkstra排序结果:\n");
	for(i=1;i<=vexnum;i++)
	{
		int x=i;
		if(x==v1)
			continue;
		if(s[x]==1)		//!!!s[x]==1
		{
			while(x!=v1)
			{
				printf("%d<--",	x);
				x=path[x];
			}
			printf("%d %d\n",x,dist[i]);
		}
		else printf("32767\n");
	}	
		
}
int main()
{
	int vexnum;
	int cost[VEXSIZE][VEXSIZE];
	vexnum=creat(cost);
	Dijkstra(cost, vexnum);
 	return 0;
}


2. 结果


猜你喜欢

转载自blog.csdn.net/lituusliu/article/details/78071848