zoukankan      html  css  js  c++  java
  • 最短路 迪杰斯特拉.cpp

    <span style="color:#3333ff;">#include<stdio.h>
    #include<stdlib.h>
    #define INITITY 999//最大值
    #define VERTEX 20//最多顶点个数
    #define FALSE 0
    #define TURE 1
    #define size 30
    #define OVERFLOW -1
    
    typedef struct ArcCell{
       int adj;//权值类型
    }ArcCell,AdjMatrix[VERTEX][VERTEX];
    
    typedef struct{
      char vexs[20];//顶点向量
      AdjMatrix arcs;//邻接矩阵
      int vexnum,arcnum;//图的当前顶点数和弧数
    }MGraph;
    
    typedef struct{
      char *top,*base;//栈顶指针,栈尾指针
    }Stack;
    
    int P[20][20];
    void InitStack(Stack *S)//初始化栈
    {
       S->base=(char *)malloc(VERTEX*sizeof(char));
       S->top=S->base;
    }
    
    void DestoyStock(Stack *S)//销毁栈
    {
      S->top=S->base;
    }
    
    void PushStack(Stack *S,char a)//元素压栈
    {
     if(S->top-S->base>size)
        exit(OVERFLOW);
      else *S->top++=a;
    }
    
    void PrintfStack(Stack *S)//输出栈
    {
     if(S->top==S->base)
        exit(OVERFLOW);
        printf("%c",*--S->top);
      while(S->top!=S->base)
        printf("->%c",*--S->top);
    
    }
    
    int Located(MGraph *G,char v1)//寻找顶点v1的位置
    { int i;
       for(i=1;i<=G->vexnum;i++)
    	 if(G->vexs[i]==v1) return i;
    }
    
    void CreateUDN(MGraph *G){
       int i,j,k,w;
        char v1,v2;
       printf("请输入图的顶点数:");
         scanf("%d",&G->vexnum);getchar();
      for(i=1;i<=G->vexnum;i++)
            G->vexs[i]=0;//顶点向量置零
       for(i=1;i<=G->vexnum;i++){
          printf("请输入第%d个顶点:",i),
          scanf("%c",&G->vexs[i]),getchar();//构造顶点向量
          }
       for(i=1;i<=G->vexnum;i++)
          for(j=1;j<=G->vexnum;j++)
    		    G->arcs[i][j].adj=999;//邻接矩阵初始化
       printf("请输入图的弧数:");
          scanf("%d",&G->arcnum);getchar();
       for(k=1;k<=G->arcnum;k++)
         {
           printf("请输入第%d条弧向量<v1,v2,weight>:",k);
            scanf("%c,%c,%d",&v1,&v2,&w);getchar();
            i=Located(G,v1); j=Located(G,v2);//查找位置
            G->arcs[i][j].adj=w;//更新权值最小
            G->arcs[j][i]=G->arcs[i][j];
       }
    }
    
    void ShortestPath_DIJ(MGraph *G,int u,int *D)//求最短路径,迪杰斯特拉算法
    {int final[VERTEX],v,w,i,min,k=1;
       for(v=1;v<=G->vexnum;v++)
         {
           final[v]=FALSE;D[v]=G->arcs[u][v].adj;
           for(w=1;w<=G->vexnum;w++)
             P[v][w]=FALSE;//设空路径
         }
            D[u]=0,final[u]=FALSE;//初始化,u属于S
          for(i=1;i<=G->vexnum;i++){//开始主循环,每一次求得u到其他顶点的最短路径
            min=INITITY;//当前所知的离u顶点的最短距离
            for(w=0;w<=G->vexnum;w++)
               if(!final[w])//w顶点在V-S中
                  if(D[w]<min){//w顶点离u更近
                     v=w;min=D[w];
                     }
            final[v]=TURE;//离u更近的v加入中
            for(w=0;w<=G->vexnum;w++)//更新当前最短路径及距离
               if(!final[w]&&(min+G->arcs[v][w].adj<D[w])){//修改D[w]和P[w]
               D[w]=min+G->arcs[v][w].adj;
               P[u][w]=v;P[w][u]=v;
               }
             }
    }
    
    int main()
    {  int j,u,D[20],a;
       MGraph G;
       Stack S;InitStack(&S);//初始化栈
       CreateUDN(&G);
       printf("
    ****************************最短路径************************************
    ");
       for(u=1;u<G.vexnum;u++){
    	   printf("以%c为起点:
    ",G.vexs[u]);
        ShortestPath_DIJ(&G,u,D);//求最短路径
        for(j=u+1;j<=G.vexnum;j++){
         printf("    %c->%c的最短路径为:",G.vexs[u],G.vexs[j]);
           if(P[u][j]==0)//如果P[u][j]=0,则两点之间的最短路径是直达的,只输出两个顶点即可
              printf("%c->%c",G.vexs[u],G.vexs[j]),
              printf("    权值:%d ",D[j]),printf("
    ");
           else{//不是直达,则将其所经节点依次存入栈中,最后输出
             PushStack(&S,G.vexs[j]);
             a=P[u][j];//a=0,则u与j之间是直达的,否则之间还经过其他的节点
             while(a!=0)//中间所经节点依次压入栈中
             {
               PushStack(&S,G.vexs[a]);
               a=P[u][a];
             }
               PushStack(&S,G.vexs[u]);//将起始节点压入栈中
               PrintfStack(&S);
               printf("    权值:%d ",D[j]);printf("
    ");
               DestoyStock(&S);}
           }
          }
      return 0;
    }
    </span>


  • 相关阅读:
    lms框架服务注册中心
    lms框架应用服务接口和服务条目详解
    lms框架模块详解
    lms微服务框架主机介绍
    lms框架分布式事务使用简介
    MySQL锁总结
    VSCode 输出 java SSL 请求过程
    PowerShell自动化发布SpringBoot项目到Tomcat
    AWS EC2 使用---安装Docker和Nginx
    使用PowerShell连接到Linux
  • 原文地址:https://www.cnblogs.com/codeyuan/p/4254546.html
Copyright © 2011-2022 走看看