图示:

模版:

  1 /*
  2 Dijkstra计算单源最短路径,并记录路径
  3
  4 m个点,n条边,每条边上的权值非负,求起点st到终点et的最短路径
  5
  6 input:
  7 n m st et
  8 6 10 1 6
  9 1 2 6
 10 1 3 2
 11 1 4 1
 12 2 3 6
 13 2 5 3
 14 3 4 2
 15 3 5 2
 16 3 6 4
 17 4 6 5
 18 5 6 3
 19
 20 output:
 21 6
 22 1-->4-->6
 23 */
 24
 25
 26
 27 #include<iostream>
 28 #include<stdio.h>
 29 #include<cstring>
 30 using namespace std;
 31
 32 #define INF 0xfffffff
 33 #define MAXN 1010
 34
 35 int n,m;                    /*n:点数,m:边数*/
 36 int st,et;                    /*st:起点,et:终点*/
 37 int  weight[MAXN][MAXN];    /*保存的是边权值*/
 38 int  dis[MAXN];                /*保存源点到任意点之间的最短路*/
 39 int  father[MAXN];            /*保存i点的父亲节点*/
 40 int  vis[MAXN];                /*记录哪些顶点已经求过最短路*/
 41
 42
 43 void input()
 44 {
 45     scanf("%d%d%d%d",&n,&m,&st,&et);
 46     int i,j;
 47     for(i=1;i<=n;i++)
 48     {
 49         for(j=1;j<=n;j++)
 50             weight[i][j]=INF;
 51         weight[i][i]=0;
 52     }
 53     int start,end,value;
 54     for(i=0;i<m;i++)
 55     {
 56         scanf("%d%d%d",&start,&end,&value);
 57         if(weight[start][end]>value)                        //去重
 58             weight[start][end]=weight[end][start]=value;    //无向图
 59     }
 60 }
 61
 62 void dijkstra()
 63 {
 64     int i,j;
 65     memset(vis,0,sizeof(vis));
 66     memset(father,0,sizeof(father));
 67
 68     //初始化dis数组
 69     for(i=1;i<=n;i++)
 70         dis[i]=INF;
 71     dis[st]=0;
 72
 73     //枚举n个点
 74     for(i=1;i<=n;i++)
 75     {
 76         int pos=-1;
 77
 78         //找到未加入集合的最短路的点
 79         for(j=1;j<=n;j++)
 80             if(!vis[j]&&(pos==-1||dis[j]<dis[pos]))
 81                 pos=j;
 82
 83         //标记这个点已经走过
 84         vis[pos]=1;
 85
 86         //更新dis
 87         for(j=1;j<=n;j++)
 88             if(!vis[j]&&(dis[j]>dis[pos]+weight[pos][j]))
 89             {
 90                 dis[j]=dis[pos]+weight[pos][j];
 91                 father[j]=pos;
 92             }
 93     }
 94 }
 95
 96 void output()
 97 {
 98     printf("%d\n",dis[et]);
 99     int que[MAXN];
100     int cnt=0;
101     int tmp=et;
102     while(father[tmp]!=0)
103     {
104         que[cnt++]=tmp;
105         tmp=father[tmp];
106     }
107     int i;
108     printf("%d",st);
109     for(i=cnt-1;i>=0;i--)
110         printf("-->%d",que[i]);
111     printf("\n");
112 }
113
114
115 int main()
116 {
117     input();
118     dijkstra();
119     output();
120     return 0;
121 }


变形1:PAT 1030:http://www.patest.cn/contests/pat-a-practise/1030

题意:在原有计算weight的基础之上,再添加一个cost,最短路不唯一时,cost取最小。

分析:

  1 #include<stack>
  2 #include<stdio.h>
  3 using namespace std;
  4
  5 #define MAXN 502
  6 #define INF 0xfffffff
  7
  8 int n,m,s,d;
  9 int weight[MAXN][MAXN];
 10 int cost[MAXN][MAXN];
 11 int dis[MAXN];
 12 int cos[MAXN];
 13 int pre[MAXN];
 14 int vis[MAXN];
 15
 16 void init()
 17 {
 18     int i,j;
 19     for(i=0;i<n;i++)
 20     {
 21         for(j=0;j<n;j++)
 22         {
 23             weight[i][j]=INF;
 24             cost[i][j]=INF;
 25         }
 26     }
 27 }
 28
 29 void input()
 30 {
 31     int i,j;
 32
 33     scanf("%d%d%d%d",&n,&m,&s,&d);
 34
 35     init();
 36
 37     for(i=0;i<m;i++)
 38     {
 39         int st,et,di,co;
 40         scanf("%d%d%d%d",&st,&et,&di,&co);
 41         if(di<weight[st][et])
 42         {
 43             weight[st][et]=weight[et][st]=di;
 44             cost[st][et]=cost[et][st]=co;
 45         }
 46         else if(di==weight[st][et]&&co<cost[st][et])
 47         {
 48             cost[st][et]=cost[et][st]=co;
 49         }
 50     }
 51 }
 52
 53 void dijkstra()
 54 {
 55     int i,j;
 56
 57     for(i=0;i<n;i++)
 58     {
 59         vis[i]=0;
 60         pre[i]=-1;
 61         dis[i]=weight[s][i];
 62         cos[i]=cost[s][i];
 63     }
 64
 65     vis[s]=1;
 66
 67     int mindist,pos;
 68
 69     for(i=0;i<n;i++)
 70     {
 71         mindist=INF;
 72         for(j=0;j<n;j++)
 73         {
 74             if(!vis[j]&&mindist>dis[j])
 75             {
 76                 mindist=dis[j];
 77                 pos=j;
 78             }
 79         }
 80
 81         vis[pos]=1;
 82
 83         if(pos==d)
 84         {
 85             return ;
 86         }
 87
 88         for(j=0;j<n;j++)89         {90             if(!vis[j]&&weight[pos][j]<INF)91             {92                 if(dis[j]>dis[pos]+weight[pos][j])93                 {94                     dis[j]=dis[pos]+weight[pos][j];95                     cos[j]=cos[pos]+cost[pos][j];96                     pre[j]=pos;97                 }98                 else if(dis[j]==dis[pos]+weight[pos][j])    99                 {
100                     if(cos[j]>cos[pos]+cost[pos][j])
101                     {
102                         cos[j]=cos[pos]+cost[pos][j];
103                         pre[j]=pos;
104                     }
105                 }
106             }
107         }       
108     }
109 }
110
111 void output()
112 {
113     stack<int>sta;
114     int p=d;
115     while(p!=-1)
116     {
117         sta.push(p);
118         p=pre[p];
119     }
120
121     printf("%d",s);
122     while(!sta.empty())
123     {
124         printf(" %d",sta.top());
125         sta.pop();
126     }
127
128     printf(" %d %d\n",dis[d],cos[d]);
129 }
130
131 int main()
132 {
133     input();
134     if(s==d)
135     {
136         printf("%d %d 0 0\n",s,d);
137         return 0;
138     }
139     dijkstra();
140     output();
141     return 0;
142 } 


变形2:PAT 1018:http://pat.zju.edu.cn/contests/pat-a-practise/1018

转载于:https://www.cnblogs.com/XBWer/p/4088368.html

【图算法】Dijkstra算法及变形相关推荐

  1. dijkstra算法代码_数据科学家需要知道的5种图算法(附代码)

    在本文中,我将讨论一些你应该知道的最重要的图算法,以及如何使用Python实现它们. 作者:AI公园 导读 因为图分析是数据科学家的未来. 作为数据科学家,我们对pandas.SQL或任何其他关系数据 ...

  2. dijkstra算法代码_深度好文:改变了我们生活方式最有影响力的5种图算法

    作者:Rahul Agarwal编译:刘静图灵联邦编辑部出品本文作者Rahul Agarwal是一位数据科学家,近期,他在Medium上分享了常用的5种图算法的介绍和代码实现.以下是具体博文内容:作为 ...

  3. 自动寻路算法python_关于Dijkstra算法和其他的一些图算法(Johnson, Floyd-Warshall, A*)解决最短路径问题的方法的Python实现。...

    这篇文章其实主要想说的是如何解决最短路径的问题. 其实最短路径问题,我们在生活中都在不知不觉的使用.比如我们在上网的时候,互联网传输采用了各种各样的数据包路由方法.这些路由算法都在幕后工作. 还有一些 ...

  4. 图算法——求最短路径(Dijkstra算法)

    目录 一.什么是最短路径 二.迪杰斯特拉(Dijkstra)算法 三.应用Dijkstra算法 (1) Dijkstra算法函数分析 求图的最短路径在实际生活中有许多应用,比如说在你在一个景区的某个景 ...

  5. 一步一步深入理解Dijkstra算法

    先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...

  6. dijkstra 算法_最短路径问题Dijkstra算法详解

    1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...

  7. 数据结构最短路径例题_编程小白暑期进阶笔记45-C语言数据结构与算法最短路径和dijkstra算法...

    最短路径 算法特点: 迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算法或者作为其他图算法的一个子模块. 算法思路: Dijks ...

  8. dijkstra算法原理_这 10 大基础算法,程序员必知必会!

    来源:博客园原文地址:http://kb.cnblogs.com/page/210687/算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个项目要Ο(nlogn)次 ...

  9. 最短路径问题 --- Dijkstra算法详解

    最短路径问题 最短路径问题 1.最短路径问题介绍 2.Dijkstra 算法思路 3.Dijkstra算法示例演示 4.Dijkstra算法的代码实现(c++) 参考 最短路径问题 1.最短路径问题介 ...

最新文章

  1. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
  2. JAVA常用框架和插件
  3. 【java】Java异常处理总结
  4. (一)Git学习记录(不断更新)
  5. pcie ep 应该支持哪种interrupt_7寸国产笔记本评测,酷睿处理器+8G+256G,还支持手写笔...
  6. vue项目(webpack+mintui),使用hbuilder打包app - 小小人儿大大梦想 - 博客园
  7. 【HNOI2013】消毒
  8. 实例4:python
  9. c语言用菜单做计算器,小白求大神帮忙用C语言做个多功能计算器!!!!
  10. php连接虚拟机中mysql数据库吗,PHP连接MySQL数据库的三种方式
  11. nginx rewrite解决 jenkins error 404心得笔记
  12. Linux ssh 配置
  13. mysql基础3-数据表的相关操作1
  14. IOS逆向-ASLR
  15. 手把手会教你搭建微信小程序服务器node!!!
  16. Mysql(下载、安装、环境配置详细图文)
  17. java事件处理入门
  18. linux用户的邮件存在哪里,在Linux系统中收发及查看邮件
  19. ·禅思·的寓意和思索
  20. 消息队列8:RabbitMq的QOS实验

热门文章

  1. pelco-d协议数据解析示例
  2. 对于bhuman中striker文件解析
  3. #pragma pack(1)的作用
  4. win10计算机无限弹网页,win10系统浏览网页时频繁弹出广告怎么办 Window10阻止网页弹出广告的四种方法...
  5. 粒子系统模拟-计算机图形学 豆瓣,基于粒子系统的瀑布模拟与实现
  6. 计算机技术在职研究生学校,计算机技术在职研究生招生2020
  7. kafka偏移量保存到mysql里_SparkStreaming+kafka保存offset的偏移量到mysql案例
  8. 008_表内容的插入删除修改
  9. 第三篇 :Mysql存储引擎、数据导入导出、管理表记录、匹配条件
  10. php返回图片给安卓_android上传图片到PHP的过程详解