问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

以邻接表作存储结构实现求源点到其余各顶点的最短路径的Dijkstra算法

发布网友 发布时间:2022-05-20 09:54

我来回答

1个回答

热心网友 时间:2023-10-15 19:13

具体算法为:

//Dijkstra求单源最短路径

#include<stdio.h>

#define N 20 //图的顶点最多数

#define MAX 1000

#define MIN -1

typedef int ElemType;//图的顶点标识,这里为自然数

//图的结点结构

typedef struct ArcNode{

  ElemType adjvex;//图的顶点 (该弧指向顶点的位置)

  struct ArcNode *nextarc;//指向下一条弧的指针

  int info//该弧权值

}ArcNode;

//表头结点表

typedef struct VertexNode{

   ElemType data;

   ArcNode *firstarc;

}VertexNode;

//图

typedef struct AdjList{

   VertexNode vertex[N];

   int vexnum;//图的顶点数

   int arcnum;//弧数;

   int kind;//图的种类(kind=1为有向图)

   int dist[N];//图的路径长度

   int path[N];//辅助数组

}AdjList;

//边

typedef struct{

   int i;

   int j;

   int f;

}Side;

//邻接表法创建图

int CreateDAG(AdjList *L){

   int i,j;

   ArcNode *p=NULL;

   //测试用例

   Side S[N];

   S[0].i=1;S[0].j=3;S[0].f=10;

   S[1].i=1;S[1].j=5;S[1].f=30;

   S[2].i=1;S[2].j=6;S[2].f=100;

   S[3].i=2;S[3].j=3;S[3].f=5;

   S[4].i=3;S[4].j=4;S[4].f=50;

   S[5].i=4;S[5].j=6;S[5].f=10;

   S[6].i=5;S[6].j=6;S[6].f=60;

   S[7].i=5;S[7].j=4;S[7].f=20;

   for(i=1;i<7;i++){

      L->vertex[i].data=i;

      L->dist[i]=MAX;//设为最大值,表示不可达

      L->path[i]=MIN;//设为最小值,表示尚未初始化

      //L->vertex[i].indegree=0;

      L->vertex[i].firstarc=NULL;

   }

   L->kind=1;

   L->vexnum=6;

   L->arcnum=8;

   for(i=0;i<8;i++){

        p=(ArcNode *)malloc(sizeof(ArcNode));

        p->adjvex=S[i].j;

        p->info=S[i].f;

        p->nextarc=L->vertex[(S[i].i)].firstarc;

        L->vertex[(S[i].i)].firstarc=p;

        if(S[i].i==1){//初始顶点为1

            L->dist[(S[i].j)]=S[i].f;

            //L->path[(S[i].j)]=S[i].f;

        }

       // L->vertex[(S[i].j)].indegree++;

   }

   return 1;

}

//输出邻接表存储

void PrintALGraph(AdjList *L){

   ArcNode *p=NULL;

   int i,k=0;

   for(i=1;i<=L->vexnum;i++){

      k=L->vertex[i].data;

      printf("V%d",k);

     // printf(" 入度为%d 邻接点有 ",(L->vertex[i].indegree));

      p=L->vertex[k].firstarc;

      while(p!=NULL){

         printf(" ->%d",p->adjvex);

         p=p->nextarc;

      }

      printf("\n");

   }

}

//Dijkstra求单源最短路径

void Dijkstra(AdjList *L){

   int i=1,j,k=0;

   Side s;

   L->path[1]=0;

   ArcNode *p=NULL;

   while(k<10){

    s.f=MAX;

    for(i=1;i<=L->vexnum;i++){

      if(L->path[i]!=MIN){

        p=L->vertex[i].firstarc;

        if(p!=NULL){

           while(p!=NULL){

              if(s.f>p->info&&L->path[(p->adjvex)]==MIN){

                 s.f=p->info;

                 s.i=i;

                 s.j=p->adjvex;

              }

              p=p->nextarc;

           }

        }

      }

    }

          if(s.f==MAX){

 

          }else if(L->dist[(s.j)]>L->dist[(s.i)]+s.f){

               L->dist[(s.j)]=L->dist[(s.i)]+s.f;

               L->path[(s.j)]=L->dist[(s.j)];

          }else{

               L->path[(s.j)]=L->dist[(s.j)];

          }

           k++;

   }

     //输出

   printf("输出最短路径:\n");

   for(i=1;i<=L->vexnum;i++){

       if(L->dist[i]==1000||i==1){

         printf("v1到v%d不存在最短路径\n",i);

       }else{

         printf("v1到v%d的最短路径是%d\n",i,L->dist[i]);

       }

       printf("path is %d\n",L->path[i]);

   }

}

int main(){

   AdjList *L=(AdjList *)malloc(sizeof(AdjList));

   if(CreateDAG(L)==1){

        PrintALGraph(L);

        Dijkstra(L);

   }else{

      printf("创建失败\n");

   }

 }

扩展资料:

要求带权有向图中某一顶点到其他各顶点的最短路径,常用Dijkstra算法,该算法基本思想是,先将图的顶点分为两个集合,一个为已求出最短路径的终点集合(开始为原点v1),另一个为还未求出最短路径的顶点集合(开始为除v1外的全部结点),然后按最短路径长度的递增顺序逐个将第二个集合的顶点加到第一组中。

算法中使用dist数组,dist[i]表示目前已经找到、v1到vi的当前最短路径,否则为MAX;path数组,作为是否找到该点最短路径的标志,path[i]==MIN表示为未找到,否则为最短路径值。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
饥荒巨鸟图腾有什么用 饥荒巨鸟图腾怎么激活 恐惧饥荒健康怎么回复 健康值系统详解 想在京东买32g内存卡,发个商品号给我吧 民族文化浅谈普米族的宗教信仰 iphone4s进入恢复模式后,过几十秒就自动关机 hdr10是什么意思(hdr10是什么) 郑州禧年化妆摄影学校的专业设置 乔迁择吉2022年属鸡4月最佳入新居日子? 变电站中110kv配电变压器最小多大容量? Dijkstrath算法是什么?如何用Dijkstrath算法求计算机网络拓扑图的最短路径? 利用Dijkstra算法求下图中从顶点1到其它各顶点间的最短路径,按下面表格形式 小米note3开屏经常跳转网页 在淘宝网开店能不能买家具?怎么送到买家手里? 淘宝上商品到了买家手里,而交易却关闭了,怎么办,我现在没法找他要钱... 我刚才淘宝开店,怎么把货运到买家手里,打快递电话叫快递上门拿货吗 在淘宝上买东西,卖家发货,快递没有把货物送到买家手上,但在物流上已写签收,这是怎么回事? 淘宝卖家同意退款的钱已经回到买家手里,那么t卖家有没有理由向淘宝申诉... linux应用软件的安装 活动义齿、固定义齿有什么区别 让隔离人员加二维码进群怎么写便签 要装活动义齿了,有点关于活动假牙的问题请教。 梦见前妻坐在红色车上我在后面跑着追上了? 梦见前妻回来拿扫把追着打我 经常梦见前妻来找我,可是她已结婚五年了还有了孩子这是怎么回事。 梦见前妻与儿子一直奔跑追我 梦见我和我的新女有被前妻追骂着? 梦见碰上前妻试装婚纱,我一劲的骂,她跟娘家人来追我是什么意思? 做梦见我前妻在前面跑我在后面拼命追。最后她停下来故意在那里等我 梦见前妻对我紧追不舍 如何记录Dijkstra最短路径的过程 Dijkstra算法流程图 DIJKSTRA的最短路径怎么求 在图中求的 我不明白具体过程 用Dijkstra算法求最短路径 贵阳这两天(2011年3月18号-19号)的天气如何? 这两天贵州贵阳天气怎么样? 今天贵阳市天气如何? 现在苹果xsmax好用吗? 索尼RXO2怎么样 我和爸爸的关系 我和爸爸是子女关系吗 我和爸爸的关系很不好。我该怎么办 我和爸爸的关系…我不知道该怎么办了,大家帮帮我… 我和父亲的关系该如何相处下去 我和爸爸“兄弟”的关系是什么? 实验台长宽高的尺寸是多少? 实验台常规尺寸是多少? 实验台一般尺寸? 实验台尺寸怎么确定? 振动实验台的型号及尺寸