狄克斯特拉(Dijkstra)算法

從一個頂點到其餘各頂點的最短路徑

狄克斯特拉算法實現

#include <stdio.h>
#define MaxSize 100
#define INF 32767	//INF表示∞
#define	MAXV 100	//最大頂點個數
typedef int InfoType;

typedef struct 
{  	
	int no;						//頂點編號
	InfoType info;				//頂點其他信息
} VertexType;					//頂點類型
typedef struct  				//圖的定義
{  	
	int edges[MAXV][MAXV]; 		//鄰接矩陣
   	int n,e;   					//頂點數,弧數
	VertexType vexs[MAXV];		//存放頂點信息
} MGraph;						//圖的鄰接矩陣類型

void Ppath(int path[],int i,int v)  //前向遞歸查找路徑上的頂點
{
	int k;
	k=path[i];
	if (k==v)  return;			//找到了起點則返回
	Ppath(path,k,v);			//找頂點k的前一個頂點
	printf("%d,",k);			//輸出頂點k
}
void Dispath(int dist[],int path[],int s[],int n,int v)
{
	int i;
	for (i=0;i<n;i++)
		if (s[i]==1) 
		{	
			printf("  從%d到%d的最短路徑長度爲:%d\t路徑爲:",v,i,dist[i]);
			printf("%d,",v);	//輸出路徑上的起點
			Ppath(path,i,v);	//輸出路徑上的中間點
			printf("%d\n",i);	//輸出路徑上的終點
		}
		else  printf("從%d到%d不存在路徑\n",v,i);
}
void Dijkstra(MGraph g,int v)
{
	int dist[MAXV],path[MAXV];
	int s[MAXV];
	int mindis,i,j,u;
	for (i=0;i<g.n;i++) 
	{	
		dist[i]=g.edges[v][i];   	//距離初始化
		s[i]=0;                		//s[]置空
		if (g.edges[v][i]<INF)		//路徑初始化
			path[i]=v;
		else
		    path[i]=-1;
	}
	s[v]=1;path[v]=0;        		//源點編號v放入s中
	for (i=0;i<g.n;i++)    			//循環直到所有頂點的最短路徑都求出
	{	
		mindis=INF;					//mindis置最小長度初值
		for (j=0;j<g.n;j++)     	//選取不在s中且具有最小距離的頂點u
			if (s[j]==0 && dist[j]<mindis) 
			{ 	
				u=j;
				mindis=dist[j];	
			}
		s[u]=1;               		//頂點u加入s中
		for (j=0;j<g.n;j++)     	//修改不在s中的頂點的距離
			if (s[j]==0) 
				if (g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j]) 
				{	
					dist[j]=dist[u]+g.edges[u][j];
					path[j]=u;
				}  
	}
	Dispath(dist,path,s,g.n,v);  	//輸出最短路徑
}

void main()
{
	int i,j;
	MGraph g;
	g.n=7;g.e=12;
	int a[7][MAXV]={
		{0,4,6,6,INF,INF,INF},
		{INF,0,1,INF,7,INF,INF},
		{INF,INF,0,INF,6,4,INF},
		{INF,INF,2,0,INF,5,INF},
		{INF,INF,INF,INF,0,INF,6},
		{INF,INF,INF,INF,1,0,8},
		{INF,INF,INF,INF,INF,INF,0}};
	for (i=0;i<g.n;i++)		//建立圖9.16所示的圖的鄰接矩陣
		for (j=0;j<g.n;j++)
			g.edges[i][j]=a[i][j];
	printf("最小生成樹構成:\n");
	Dijkstra(g,0);
	printf("\n");
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章