zoukankan      html  css  js  c++  java
  • Floyd最短路


    用邻接矩阵实现floyd找最短路算法

    测试所用图如下:


    #include<string.h>
    #include<string>
    #include<algorithm>
    #include<cmath>
    #include<stdio.h>
    #include<iostream>
    #include<set>
    #define inf 65535
    using namespace std;
    struct Graph//用邻接矩阵来保存图
    {
    int arc[100][100];
    int vertex[100];
    int num_ver,num_edge;
    };
    typedef int PathMatirx[100][100];//用来记录路径
    typedef int ShortPathTable[100][100];//用来记录各点到各点的最短距离
    void create(Graph *g)//建立邻接矩阵
    {
    scanf("%d%d",&g->num_ver,&g->num_edge);
    int i,j,y,x,z;
    for(i=0;i<g->num_ver;i++)//输入顶点
    scanf("%d",&g->vertex[i]);
    for(i=0;i<g->num_ver;i++)//邻接矩阵初始化
        {
        for(j=0;j<g->num_ver;j++)
        {
            if(i==j)g->arc[i][j]=0;
            else g->arc[i][j]=inf;
    
        }
    }
    for(i=0;i<g->num_edge;i++)//输入边的信息
    {
        scanf("%d%d%d",&x,&y,&z);
        g->arc[x][y]=z;
        g->arc[y][x]=z;
    }
    }
    void shortpath(Graph *g,PathMatirx *p,ShortPathTable *d)
    {//求最短路及其路径
    int v,w,k;
    
    for(v=0;v<g->num_ver;v++){
        for(w=0;w<g->num_ver;w++){
            (*d)[v][w]=g->arc[v][w];
            (*p)[v][w]=w;
        }
    }
    for(k=0;k<g->num_ver;k++){
        for(v=0;v<g->num_ver;v++)
        {
            for(w=0;w<g->num_ver;w++)
            {
               if((*d)[v][w]>(*d)[v][k]+(*d)[k][w]){
                (*d)[v][w]=(*d)[v][k]+(*d)[k][w];
                (*p)[v][w]=(*p)[v][k];
               }
    
            }
        }
    }
    //以下一段是测试用
    for(int i=0;i<g->num_ver;i++){
        for(int j=0;j<g->num_ver;j++)
            printf("%5d ",(*d)[i][j]);
        printf("
    ");
    }
    
    }
    void ShowPath(Graph *g,PathMatirx *p,ShortPathTable *d,int x,int y){
    int v,w,tmp;
    for(w=0;w<g->num_ver;w++)
    printf("*%d ",(*d)[x][w]);//打印起始点到各点的最短距离
    printf("
    ");
    printf("%d",x);//打印起点
    v=(*p)[x][y];
    while(v!=y){
        printf("->%d",v);
        v=(*p)[v][y];
    }
    printf("->%d
    ",y);//打印终点
    }
    
    int main(){
    int i,j,k;
    Graph G;
    create(&G);
    ShortPathTable d;
    PathMatirx p;
    shortpath(&G,&p,&d);
    /*for(i=0;i<G.num_ver;i++){
        for(j=0;j<G.num_ver;j++)
            printf("%d ",d[i][j]);
        printf("
    ");
    }
    
    for(i=0;i<G.num_ver;i++){
        for(j=0;j<G.num_ver;j++)
            printf("%d ",p[i][j]);
        printf("
    ");
    }
    ShowPath(&G,&p,&d,1,7);
    
    return 0;
    }
    /*
    9 16
    0 1 2 3 4 5 6 7 8
    0 1 1
    0 2 5
    1 3 7
    1 4 5
    1 2 3
    2 4 1
    2 5 7
    3 6 3
    3 4 2
    4 6 6
    4 7 9
    4 5 3
    5 7 5
    6 8 7
    6 7 2
    7 8 4
    */

    ShortPathTable矩阵里[v][w]代表v到w的最短距离

    在PathMatirx矩阵里找v到x路径时,就打印相应的那一列,比如说0->8,则从0

    开始按索引打印到8.


    (图来自<<大话数据>>一书)



    测试结果如下图:


  • 相关阅读:
    200斤的甄子丹还是这么灵活能打欢乐,拯救无聊就靠他了
    redis 发布与订阅
    洛谷P2294 [HNOI2005]狡猾的商人
    洛谷P2294 [HNOI2005]狡猾的商人
    崛起于Springboot2.X之开发拦截器(21)
    pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!
    pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!
    pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!
    pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!
    Openssh
  • 原文地址:https://www.cnblogs.com/hjch0708/p/7554823.html
Copyright © 2011-2022 走看看