• Floyd算法


    求每两个顶点之间的最短距离

    #include<iostream>
    using namespace std;
    
    #define    N 100//最大顶点个数
    #define INF 32767 
    typedef struct//图的邻接矩阵类型
    {      
        int edges[N][N]; //邻接矩阵
           int vexnum,arcnum; //顶点数,弧数
        //int vexs[N];//存放顶点信息---如该顶点的下一个顶点
    } MGraph;
    void DispMG(MGraph g);//输出邻接矩阵
    void Floyd(MGraph g);//弗洛伊德算法---计算每对顶点之间的最短路径
    void DisPath(int A[][N],int Path[][N],int n);//输出路径
    void PPath(int Path[][N],int i,int j);
    
    int main()
    {
        /*int A[N][6]={
                        {INF,5,INF,7,INF,INF},
                        {INF,INF,4,INF,INF,INF},
                        {8,INF,INF,INF,INF,9},
                        {INF,INF,5,INF,INF,6},
                        {INF,INF,INF,5,INF,INF},
                        {3,INF,INF,INF,1,INF}
                    };*/
        int A[N][6]={    {INF,INF,10 ,INF,30 ,100},
                        {INF,INF,5  ,INF,INF,INF},
                        {INF,INF,INF,50 ,INF,INF},
                        {INF,INF,INF,INF,INF,10 },
                        {INF,INF,INF,20 ,INF,60 },
                        {INF,INF,INF,INF,INF,INF}
                    };
        MGraph g;//实例化邻接矩阵
        g.vexnum=6;
        g.arcnum=10;//6个顶点,10条边
        for (int i=0;i<g.vexnum;i++)
            for (int j=0;j<g.vexnum;j++)
                g.edges[i][j]=A[i][j];
    
        printf("有向图G的邻接矩阵:\n");
        DispMG(g);//输出邻接矩阵
        Floyd(g);//调用算法并输出每两点之间的距离
        return 0; 
    }
    
    
    void Floyd(MGraph g)//弗洛伊德算法从每对顶点之间的最短路径
    {
        int i,j,k;
        int Arr[N][N],Path[N][N];//Arr[][]---记录各点间的最小距离,path[][]---记录路径中间节点    
        for (i=0;i<g.vexnum;i++)
            for (j=0;j<g.vexnum;j++)//给Arr[][]置初值 
            {    
                Arr[i][j]=g.edges[i][j];//
                Path[i][j]=-1;//从i到j中间经过的点为path[][]---没有时为-1
            }
        for (k=0;k<g.vexnum;k++)//中间节点控制---中间节点不大于k(实际上用的就是k)
        {
            for (i=0;i<g.vexnum;i++)
                for (j=0;j<g.vexnum;j++)//遍历Arr[][],看每一个节点经过k点到达所有其他节点的距离有无改善(更小)
                    if (Arr[i][j]>(Arr[i][k]+Arr[k][j])) 
                    {    
                        Arr[i][j]=Arr[i][k]+Arr[k][j];
                        Path[i][j]=k;//从顶点i到顶点j的中间点为k
                    }
        }
        printf("\n输出最短路径:\n");
        DisPath(Arr,Path,g.vexnum);   /*输出最短路径*/
    }
    void DisPath(int A[][N],int Path[][N],int n)
    {
        int i,j;
        for (i=0;i<n;i++)
            for (j=0;j<n;j++) 
                if(A[i][j]==INF)
                {
                    if(i!=j)//交通路径中---到达自身节点本就是0距离
                        printf("从%d到%d没有路径\n",i,j);
                }
                else 
                {    
                    printf("从%d到%d路径长度为:%d",i,j,A[i][j]);
                    printf("\t路径为:");printf("%d,",i);PPath(Path,i,j);
                    printf("%d\n",j);
                }
    } 
    void PPath(int Path[][N],int i,int j) 
    {
        int k=Path[i][j];
        if (k==-1)  return;
        PPath(Path,i,k);
        printf("%d,",k);
        PPath(Path,k,j);
    }
    void DispMG(MGraph g)/*输出邻接矩阵*/
    {
        int i,j;
        for (i=0;i<g.vexnum;i++)
        {
            for (j=0;j<g.vexnum;j++)
                if (g.edges[i][j]==INF)
                      printf("%4s","");
                else  printf("%4d",g.edges[i][j]);
            printf("\n");
        }
    }
  • 相关阅读:
    kali linux DVWA config 问题解决方案
    HashMap&线程
    Synchronized和java.util.concurrent.locks.Lockde区别联系
    线程池
    信息嗅探
    java子类对象和成员变量的隐写&方法重写
    Java中Super和final关键字以及异常类
    523. Continuous Subarray Sum
    494. Target Sum
    477. Total Hamming Distance
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2732497.html
Copyright © 2020-2023  润新知