图-最短路径(数据结构)

图的最短路径算法

//迪杰斯特拉算法:求某一顶点到其余各顶点的最短路径
// 弗洛伊德算法:任意一对顶点间的路径
 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 }

猜你喜欢

转载自www.cnblogs.com/aiqinger/p/12707249.html
今日推荐