【图算法】Dijkstra算法及变形
图示:
模版:
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算法及变形相关推荐
- dijkstra算法代码_数据科学家需要知道的5种图算法(附代码)
在本文中,我将讨论一些你应该知道的最重要的图算法,以及如何使用Python实现它们. 作者:AI公园 导读 因为图分析是数据科学家的未来. 作为数据科学家,我们对pandas.SQL或任何其他关系数据 ...
- dijkstra算法代码_深度好文:改变了我们生活方式最有影响力的5种图算法
作者:Rahul Agarwal编译:刘静图灵联邦编辑部出品本文作者Rahul Agarwal是一位数据科学家,近期,他在Medium上分享了常用的5种图算法的介绍和代码实现.以下是具体博文内容:作为 ...
- 自动寻路算法python_关于Dijkstra算法和其他的一些图算法(Johnson, Floyd-Warshall, A*)解决最短路径问题的方法的Python实现。...
这篇文章其实主要想说的是如何解决最短路径的问题. 其实最短路径问题,我们在生活中都在不知不觉的使用.比如我们在上网的时候,互联网传输采用了各种各样的数据包路由方法.这些路由算法都在幕后工作. 还有一些 ...
- 图算法——求最短路径(Dijkstra算法)
目录 一.什么是最短路径 二.迪杰斯特拉(Dijkstra)算法 三.应用Dijkstra算法 (1) Dijkstra算法函数分析 求图的最短路径在实际生活中有许多应用,比如说在你在一个景区的某个景 ...
- 一步一步深入理解Dijkstra算法
先简单介绍一下最短路径: 最短路径是啥?就是一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第 ...
- dijkstra 算法_最短路径问题Dijkstra算法详解
1.Dijkstra算法介绍 · 算法起源: · Djkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家E ...
- 数据结构最短路径例题_编程小白暑期进阶笔记45-C语言数据结构与算法最短路径和dijkstra算法...
最短路径 算法特点: 迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算法或者作为其他图算法的一个子模块. 算法思路: Dijks ...
- dijkstra算法原理_这 10 大基础算法,程序员必知必会!
来源:博客园原文地址:http://kb.cnblogs.com/page/210687/算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序n个项目要Ο(nlogn)次 ...
- 最短路径问题 --- Dijkstra算法详解
最短路径问题 最短路径问题 1.最短路径问题介绍 2.Dijkstra 算法思路 3.Dijkstra算法示例演示 4.Dijkstra算法的代码实现(c++) 参考 最短路径问题 1.最短路径问题介 ...
最新文章
- Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
- JAVA常用框架和插件
- 【java】Java异常处理总结
- (一)Git学习记录(不断更新)
- pcie ep 应该支持哪种interrupt_7寸国产笔记本评测,酷睿处理器+8G+256G,还支持手写笔...
- vue项目(webpack+mintui),使用hbuilder打包app - 小小人儿大大梦想 - 博客园
- 【HNOI2013】消毒
- 实例4:python
- c语言用菜单做计算器,小白求大神帮忙用C语言做个多功能计算器!!!!
- php连接虚拟机中mysql数据库吗,PHP连接MySQL数据库的三种方式
- nginx rewrite解决 jenkins error 404心得笔记
- Linux ssh 配置
- mysql基础3-数据表的相关操作1
- IOS逆向-ASLR
- 手把手会教你搭建微信小程序服务器node!!!
- Mysql(下载、安装、环境配置详细图文)
- java事件处理入门
- linux用户的邮件存在哪里,在Linux系统中收发及查看邮件
- ·禅思·的寓意和思索
- 消息队列8:RabbitMq的QOS实验
热门文章
- pelco-d协议数据解析示例
- 对于bhuman中striker文件解析
- #pragma pack(1)的作用
- win10计算机无限弹网页,win10系统浏览网页时频繁弹出广告怎么办 Window10阻止网页弹出广告的四种方法...
- 粒子系统模拟-计算机图形学 豆瓣,基于粒子系统的瀑布模拟与实现
- 计算机技术在职研究生学校,计算机技术在职研究生招生2020
- kafka偏移量保存到mysql里_SparkStreaming+kafka保存offset的偏移量到mysql案例
- 008_表内容的插入删除修改
- 第三篇 :Mysql存储引擎、数据导入导出、管理表记录、匹配条件
- php返回图片给安卓_android上传图片到PHP的过程详解