Floyd算法求最短路径

来源:互联网 发布:易语言自动按键源码 编辑:程序博客网 时间:2024/05/01 19:28

http://blog.csdn.net/hackerain/article/details/6055946

#define MAX_VERTEX_NUM 20#define MAX 1000000000typedef struct{std::string vexs[MAX_VERTEX_NUM];int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];int vertexnum,edgenum;}MGraph;void createDN_AM(MGraph &G,int n,int e){G.vertexnum=n;G.edgenum=e;int i,j,k;int weight;for(i=0;i<n;i++){cin>>G.vexs[i];}for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j)G.edges[i][j]=0;elseG.edges[i][j]=MAX;}for(k=0;k<e;k++){cin>>i>>j>>weight;G.edges[i][j]=weight;}}void ShortestPath_Floyd(MGraph &G){int i,j,k;int dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM];std::string path[2*MAX_VERTEX_NUM][2*MAX_VERTEX_NUM];for(i=0;i<G.vertexnum;i++)for(j=0;j<G.vertexnum;j++){dist[i][j]=G.edges[i][j];if(dist[i][j]<MAX){path[i][j]=G.vexs[i]+G.vexs[j];}elsepath[i][j]="";}for(k=0;k<G.vertexnum;k++)for(i=0;i<G.vertexnum;i++)for(j=0;j<G.vertexnum;j++)if(dist[i][k]+dist[k][j]<dist[i][j]){dist[i][j]=dist[i][k]+dist[k][j];path[i][j]=path[i][k]+path[k][j];}for(i=0;i<G.vertexnum;i++){for(j=0;j<G.vertexnum;j++)cout<<path[i][j]<<" "<<dist[i][j]<<" ";cout<<endl;}}int main(){MGraph G;createDN_AM(G,7,8);ShortestPath_Floyd(G);return 0;}

 

 

原文:

01.#include<iostream>  02.#include<string>  03.using namespace std;  04./*邻接矩阵的类型定义*/  05.#define MAX 10000000  06.#define MAX_VERTEX_NUM 20  07.typedef struct  08.{  09.    string vexs[MAX_VERTEX_NUM];//用一维数组存储顶点信息  10.    int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//用二维数组充当矩阵,来存储顶点边的信息  11.    int vexnum,edgenum;//顶点树和边数  12.}MGraph;  13./*构造有向网的邻接矩阵*/  14.void CreateDN_AM(MGraph &G,int n,int e)  15.{  16.    G.vexnum=n;  17.    G.edgenum=e;  18.      19.    int i,j,k;  20.    int weight;  21.    for(i=0;i<n;i++)  22.        cin>>G.vexs[i];//输入顶点信息  23.    for(i=0;i<n;i++)  24.        for(j=0;j<n;j++)  25.        {  26.            if(i==j)  27.                G.edges[i][j]=0;//主对角线上的权值为0  28.            else  29.                G.edges[i][j]=MAX;//将矩阵初始化为MAX  30.        }  31.    for(k=0;k<e;k++)  32.    {  33.        cin>>i>>j>>weight;  34.        G.edges[i][j]=weight;  35.    }  36.}  37./*弗洛伊德算法求最短路径*/  38.void ShortestPath_Floyd(MGraph &G)  39.{  40.    int i,j,k;  41.    int dist[MAX_VERTEX_NUM][MAX_VERTEX_NUM];  42.    string path[2*MAX_VERTEX_NUM][2*MAX_VERTEX_NUM];  43.    for(i=0;i<G.vexnum;i++)  44.        for(j=0;j<G.vexnum;j++)  45.        {//初始化工作  46.            dist[i][j]=G.edges[i][j];  47.            if(dist[i][j]<MAX)  48.                path[i][j]=G.vexs[i]+G.vexs[j];  49.            else  50.                path[i][j]="";  51.        }  52.    //三个for循环求最短路径  53.    for(k=0;k<G.vexnum;k++)  54.        for(i=0;i<G.vexnum;i++)  55.            for(j=0;j<G.vexnum;j++)  56.                if(dist[i][k]+dist[k][j]<dist[i][j])  57.                {  58.                    dist[i][j]=dist[i][k]+dist[k][j];  59.                    path[i][j]=path[i][k]+path[k][j];  60.                }  61.    for(i=0;i<G.vexnum;i++)  62.    {  63.        for(j=0;j<G.vexnum;j++)  64.            cout<<path[i][j]<<" "<<dist[i][j]<<" ";  65.        cout<<endl;  66.    }  67.}  68.void main()  69.{  70.    freopen("in.txt","r",stdin);  71.    MGraph G;  72.    CreateDN_AM(G,4,6);  73.    ShortestPath_Floyd(G);  74.}  


 

弗洛伊德算法主要是采用了dist二维数组来存储各个顶点之间的最短路径,然后不断更新,它的典型标识是有三个连续的for循环:将每一个顶点插入到另外两个顶点之间,看是否能得到较小的路径,这是它的主要思想,即是所谓的“试探”或是“动态”,其实理解是容易理解的,就是不好表达。