标签:
1 #include<stdio.h> 2 #define MAXSIZE 6 3 #define INF 32767 4 5 void Ppath(int path[],int i,int v0)//先序递归查找最短路径(源点为v0)上的顶点 6 { 7 int k; 8 k=path[i]; 9 if(k!=v0)//顶点Vk不是源点V0时 10 { 11 Ppath(path,k,v0);//递归查找顶点Vk的前一个顶点 12 printf("%d,",k);//输出顶点Vk 13 } 14 } 15 16 void Dispath(int dist[],int path[],int s[],int v0,int n)//输出最短路径 17 { 18 int i; 19 for(i=0;i<n;i++) 20 if(s[i]==1)//顶点Vi在集合S中 21 { 22 printf("从%d到%d的最短路径长度为:%d,路径为:",v0,i,dist[i]); 23 printf("%d,",v0);//输出路径上的源点v0; 24 Ppath(path,i,v0);//输出路径上的中间顶点vi 25 printf("%d\n",i);//输出路径上的终点 26 } 27 else 28 printf("从%d到%d不存在路径\n",v0,i); 29 } 30 31 void Dijkstra(int gm[][MAXSIZE],int v0,int n)//Dijkstra算法 32 { 33 int dist[MAXSIZE],path[MAXSIZE],s[MAXSIZE]; 34 int i,j,k,mindis; 35 for(i=0;i<n;i++) 36 { 37 dist[i]=gm[v0][i];//v0到vi的最短路径初值赋给dist[i] 38 s[i]=0;//s[i]=0表示顶点vi属于T集 39 if(gm[v0][i]<INF)//路径初始化,INF为可取的最大常数 40 path[i]=v0; 41 else 42 path[i]=-1;//v0到vi没有边 43 } 44 s[v0]=1;path[v0]=0;//V0并入集合S且V0当前最短路径中无前一个顶点 45 for(i=0;i<n;i++)//对除V0外的n-1个顶点寻找最短路径,即循环n-1次 46 { 47 mindis=INF; 48 for(j=0;j<n;j++)//从当前集合T中选择一个路径长度最短的顶点Vk 49 if(s[j]==0&&dist[j]<mindis) 50 { 51 k=j; 52 mindis=dist[j]; 53 } 54 s[k]=1;//顶点Vk加入集合S中 55 for(j=0;j<n;j++)//调整源点v0到集合T中任一顶点Vj的路径长度 56 if(s[j]==0)//顶点vj在集合T中 57 if(gm[k][j]<INF&&dist[k]+gm[k][j]<dist[j])//当V0到Vj的路径长度小于V0到Vk和Vk到Vj的路径长度时 58 { 59 dist[j]=dist[k]+gm[k][j]; 60 path[j]=k;//Vk是当前最短路径中Vj的前一个顶点 61 } 62 } 63 Dispath(dist,path,s,v0,n);//输出最短路径 64 } 65 66 void main() 67 { 68 int g[MAXSIZE][MAXSIZE]={{INF,20,15,INF,INF,INF},{2,INF,INF,INF,10,30},{INF,4,INF,INF,INF,10}, 69 {INF,INF,INF,INF,INF,INF},{INF,INF,INF,15,INF,INF},{INF,INF,INF,4,10,INF}};//定义邻接矩阵g 70 Dijkstra(g,0,6);//求顶点0的最短路径 71 }
输出:
带权有向图及邻接矩阵示意:
标签:
原文地址:http://www.cnblogs.com/wxdjss/p/5515350.html