Floyd算法求最短路径

                                                             Floyd算法

算法思想

通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。

算法过程

1,从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。
2,对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比已知的路径更短。如果是更新它。
把图用邻接矩阵G表示出来,如果从Vi到Vj有路可达,则G[i][j]=d,d表示该路的长度;否则G[i][j]=无穷大。定义一个矩阵D用来记录所插入点的信息,D[i][j]表示从Vi到Vj需要经过的点,初始化D[i][j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i][j] = min( G[i][j], G[i][k]+G[k][j] ),如果G[i][j]的值变小,则D[i][j]=k。在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。
比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3,1)=1,说明V3与V1直接相连。
例如:
求从1开始到最后一个数5的最短路径:

输入数据:

5 7
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
1 5
输出数据:
1->4->3->5
60


输出数据:
1->
60

  • 算法实现

#include<iostream>
using namespace std;
#define max 1000000000
int d[1000][1000]; //记录两点最短距离
int path[1000][1000]; //记录最短路径的信息 ,可去掉 
int main() {
    int m, n, x, y, z;
    cin>> n>> m;
    for(int i= 1; i<= n; i++) {
        for(int j= 1; j<= n; j++) {
            d[i][j]= max;
            path[i][j]= j;
        }
    }
    for(int i= 1; i<= m; i++) {
        cin>> x>> y>> z;
    	d[x][y]= z;
    	d[y][x]= z;
    }
    for(int k= 1; k<= n; k++) {
        for(int i= 1; i<= n; i++) {
            for(int j= 1; j<= n; j++) {
                if(d[i][k]+ d[k][j]< d[i][j]) {
                    d[i][j]= d[i][k]+ d[k][j];  //更新最短路径 
                    path[i][j]= path[i][k];
                }
            }
        }
    }
    int f, e;
    cin>> f>> e;
    int temp= f;
    while (temp!= e) {
        cout<< temp<< "->";
        temp= path[temp][e];
    }
    cout<< e<< endl;
    cout<< d[f][e]<< endl;
    return 0;
}



发布了69 篇原创文章 · 获赞 18 · 访问量 7万+
展开阅读全文

Floyd算法从某地到某地的最路径(无向图)

06-07

#include <stdio.h> #include <iostream> using namespace std ; #define MUNum 20 #define INFINITY 32767 #define Myprintf cout << "\n\t+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-\n" << endl typedef struct PlaneGraph { int PathLength ; char Pathname[20] ; }PlaneGraph,PG[MUNum][MUNum] ; typedef struct { char name[20] ; int num ; }infor ; typedef struct { infor vexs[MUNum] ; PG arcs ; int vexnum ,arcnum ; }AMGraph ; void InitGraph(AMGraph &G) { int i ,j ; cout << "\t请输入校园地点的数量、校园小径的个数:" ; cin >> G.vexnum >> G.arcnum ;//点 边 Myprintf ; for(i=0 ;i<G.vexnum ;i++) G.vexs[i].num = i ;//为点进行编号 cout << " 输入编号为(0-" << i << ")的校园地点的名称:\n\n" ;//店名称 for(i=0 ;i<G.vexnum ;i++) { cout << "\t" ; cin >> G.vexs[i].name ; } cout << endl ; Myprintf ; for(i=0 ;i<G.vexnum ;i++) for(j=0 ;j<G.vexnum ;j++) { G.arcs[i][j].PathLength = INFINITY ; strcpy(G.arcs[i][j].Pathname,"null"); } //输入路径信息 int v1,v2,w ; char wn[20] ; cout << "输入校园小径首尾地点编号、小径长度及小径名称\n\t(以-1 -1 -1 -1)结束输入:\n\t" << endl ; cin >> v1 >> v2 >> w >> wn ; while(v1!=-1 && v2!=-1 && w!=-1 && strcmp(wn,"-1")!=0) { cout << "\t" ; G.arcs[v1][v2].PathLength = w ; strcpy(G.arcs[v1][v2].Pathname,wn); G.arcs[v2][v1].PathLength = w ; strcpy(G.arcs[v2][v1].Pathname,wn); cin >> v1 >> v2 >> w >> wn ; } Myprintf ; } //Floyd void ShortestPath(AMGraph G) { int v,u,i,j,w,k,flag=1; int p[MUNum][MUNum][MUNum],D[MUNum][MUNum]; for(v=0 ; v<G.vexnum ; v++) for(w=0 ;w<G.vexnum ;w++) { D[v][w] = G.arcs[v][w].PathLength; for(u=0;u<G.vexnum ;u++) p[v][w][u] = 0 ;// if(D[v][w] < INFINITY) p[v][w][v] = p[v][w][w] = 1;// } for(u=0 ;u<G.vexnum;u++) for(v=0 ;v<G.vexnum;v++) for(w=0 ;w<G.vexnum;w++) if(D[v][u]+D[u][w]<D[v][w]) { D[v][w] = D[v][u]+D[u][w]; for(i=0;i<G.vexnum;i++) p[v][w][i] = p[v][u][i] || p[u][w][i];// } while(flag) { cout << "\n输入出发地点、目的地点编号:" ; cin >> k >> j ; if(k<0 || k>=G.vexnum || j<0 || j>=G.vexnum ) { cout << "该地点不存在!请重新输入!" << endl ; Myprintf ; } else if(k == j ) { cout << "始点和终点相同!请重新输入!" << endl ; Myprintf ; } else flag = 0 ; } //输出信息 int L[MUNum]; L[0] = k; int l = 1 ; cout << "\t总路线长:" << D[k][j] << endl ; cout << G.vexs[k].name ; for(u=0 ;u<G.vexnum ;u++) if(p[k][j][u] && k!=u && j!=u) { cout << " ——> " << G.vexs[u].name ; L[l] = u ; l++ ; } cout << " ——> " << G.vexs[j].name ; L[l] = j ; cout << endl ; cout << "\t路线:" ; for(u=0 ;u<l ;u++) { cout << G.arcs[L[u]] [L[u+1]].Pathname ; if(u != l-1) cout << " ——> " ; } cout << endl ; Myprintf ; } int main() { cout << "\n----------------------------------校园导航----------------------------------" << endl << endl ; AMGraph G ; InitGraph(G) ; char k[10] ; strcpy(k,"Yes"); while(strcmp(k,"Yes")==0) { ShortestPath(G); cout << "请问是否继续?Yes or No?" << endl ; cin >> k ; if(strcmp(k,"Yes") != 0 ) cout << "\n----------------------------------停止查询----------------------------------" << endl ; } return 0 ; } 数据: 10 10 大学生活动中心 敬文图书馆 实验楼 行知楼 防空洞 宿舍楼 办公楼 外国语学院 美术学院 体育馆 0 1 10 逸夫路 1 3 15 敬文路 4 3 70 达夫路 1 2 20 朝阳路 3 7 77 富康路 4 5 12 人民路 5 6 19 孚玉路 6 7 56 龙门路 8 9 73 纬七路 8 7 8 九江路 -1 -1 -1 -1 在路线输入:1 9 和 9 1的时候路线不一样,请问怎么解决 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览