zoukankan      html  css  js  c++  java
  • Dijkstra算法

    求顶点v0=0到其他各个点的最小距离

    #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 Dijkstra(MGraph g,int v0);//狄克斯特拉算法从顶点v0到其余各顶点的最短路径
    void DisPath(int dist[],int path[],int s[],int n,int v0);//由path计算最短路径
    void PPath(int path[],int i,int v0);
    
    int main()
    {
        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);//输出邻接矩阵
        int v0=0;//起始点
        Dijkstra(g,v0);
        return 0; 
    }
    
    
    void Dijkstra(MGraph g,int v0)//狄克斯特拉算法从顶点v0到其余各顶点的最短路径
    {
        int i,j;
        int Dist[N],Path[N];//Dist[j]---v0到j的最短距离、Path[j]---记录j的前一个顶点
        int S[N];//S表---标记已考察过的顶点    
        for (i=0;i<g.vexnum;i++) 
        {    
            Dist[i]=g.edges[v0][i];//距离初始化
            if (g.edges[v0][i]<INF)//路径初始化
                 Path[i]=v0;//若v0到i有路径,则i的前一个顶点是v0
            else Path[i]=-1;//         没有路径,则标记为-1
            S[i]=0;//S[]=0,表示顶点i不在S表中
        }
    
        S[v0]=1;//源点编号v0放入S表中---标记为1
        Path[v0]=0;//v0=0,他没有前缀顶点,所以他的前一个顶点设置为自己本身0
        for (i=0;i<g.vexnum;i++)                 
        {            
            int MinDis=INF;//距v0的--最小距离
            int u=-1;//距v0的--最小距离顶点编号
            for (j=0;j<g.vexnum;j++)//选取不在S表中且具有最小距离的顶点u
                if (S[j]==0 && Dist[j]<MinDis) 
                {         
                    MinDis=Dist[j];    
                    u=j;
                }
            //printf("%d\n",MinDis);
            if(MinDis!=INF)   S[u]=1;//顶点u加入S表中---标记为1
            else break;
    
            for (j=0;j<g.vexnum;j++)//修改不在S表中的顶点的距离
                if (S[j]==0) 
                    if (g.edges[u][j]<INF && Dist[u]+g.edges[u][j]<Dist[j])//u,j连通,且Dist[j]可更小                    
                    {    
                        Dist[j]=Dist[u]+g.edges[u][j];
                        Path[j]=u;//v0到j的最短路径中,j的前一个顶点是u
                    }  
        }
        printf("输出最短路径:\n");
        DisPath(Dist,Path,S,g.vexnum,v0);/*输出最短路径*/
    }
    void DisPath(int Dist[],int Path[],int S[],int n,int v0) /*由path计算最短路径*/
    {
        int i;
        for (i=0;i<n;i++)
            if (S[i]==1 && i!=v0) //S表中的顶点才有路径输出
            {    
                  printf("从%d到%d的最短路径长度为:%d",v0,i,Dist[i]);
                printf("\t路径为:%d,",v0);
                PPath(Path,i,v0);
                printf("%d\n",i);
            }
            else  
                printf("从%d到%d不存在路径\n",v0,i);
    }
    void PPath(int Path[],int i,int v0) 
    {
        int k=Path[i];
        if (k==v0)  return;
        else PPath(Path,k,v0);
        printf("%d,",k);
    }
    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");
        }
    }
  • 相关阅读:
    SpringCloud教程五:Zuul(路由+过滤)
    ubuntu18.0.4 不能下载 libgd2-dev
    ubuntu18.04下安装中文输入法
    Ubuntu下tomcat启动报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
    Java面试题汇总(一)
    Redis常见面试题
    Docker是什么
    Django实现自动发布(1数据模型)
    数据随机分配的思考
    单链表反转
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2732462.html
Copyright © 2011-2022 走看看