图-最短路径(数据结构)
图的最短路径算法
//迪杰斯特拉算法:求某一顶点到其余各顶点的最短路径
// 弗洛伊德算法:任意一对顶点间的路径
1 #include <iostream> 2 using namespace std; 3 //最短路径 4 5 //迪杰斯特拉算法:求某一顶点到其余各顶点的最短路径 6 void printfPath(int path[],int a){//输出路径算法 7 int stack[maxsize],top=-1; 8 while(path[a]!=-1){ 9 stack[++top]=path[a]; 10 a=path[a]; 11 } 12 while(top!=-1){ 13 cout<<stack[top--]<<" "; 14 } 15 cout<endl; 16 } 17 void Dijkstra(MGraph g,int v,int dist[],int path[]){ 18 int set[maxsize]; 19 int k,min; 20 for(int i=0;i<g.n;i++){//初始化 21 dist[i]=g.edges[v][i]; 22 set[i]=0; 23 if(g.edges[v][i]<INF){ 24 path[i]=v; 25 }else{ 26 path[i]=-1; 27 } 28 } 29 set[v]=1; 30 path[v]=-1; 31 for(int i=0;i<g.n-1;i++){//两层循环 32 min=INF; 33 for(int j=0;j<g.n;j++){//找出下一个顶点放入集合 34 if(set[j]==0&&dist[j]<min){ 35 k=j; 36 min=dist[j]; 37 } 38 } 39 set[k]=1; 40 for(int j=0;j<g.n;j++){//更新最短路径 41 if(set[j]==0&&dist[j]>dist[k]+edges[k][j]){ 42 dist[j]=dist[k]+edges[k][j]; 43 path[j]=k; 44 } 45 } 46 } 47 } 48 49 // 弗洛伊德算法:任意一对顶点间的路径 50 void printPath(int u,int v,int path[][maxsize]){//输出路径 51 if(path[u][v]==-1){ 52 cout<<u<<"->"<<v<<endl; 53 return; 54 } 55 else{ 56 int mid=path[u][v]; 57 printPath(u,mid,path); 58 printPath(mid,v,path); 59 } 60 } 61 void Floyd(MGraph g,int path[][maxsize]){//复杂度为N^3; 62 int A[maxsize][naxsize]; 63 for(int i=i;i<g.n;i++){//对A[][]和path[][]初始化 64 for(int j=0;j<g.n;j++){ 65 A[i][j]=g.edges[i][j]; 66 path[i][j]=-1; 67 } 68 } 69 for(int k=0;k<g.n;k++){//三层循环,完成了以K为中间点对所有i,j进行了检测和修改。 70 for(int i=0;i<g.n;i++){ 71 for(int j=0;j<g.n;j++){ 72 if(A[i][j]>A[i][k]+A[k][j]){ 73 A[i][j]=A[i][K]+A[k][j]; 74 path[i][j]=k; 75 } 76 } 77 } 78 } 79 }
越努力越幸运