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