图示:

模版:

 /*
Dijkstra计算单源最短路径,并记录路径 m个点,n条边,每条边上的权值非负,求起点st到终点et的最短路径 input:
n m st et
6 10 1 6
1 2 6
1 3 2
1 4 1
2 3 6
2 5 3
3 4 2
3 5 2
3 6 4
4 6 5
5 6 3 output:
6
1-->4-->6
*/ #include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std; #define INF 0xfffffff
#define MAXN 1010 int n,m; /*n:点数,m:边数*/
int st,et; /*st:起点,et:终点*/
int weight[MAXN][MAXN]; /*保存的是边权值*/
int dis[MAXN]; /*保存源点到任意点之间的最短路*/
int father[MAXN]; /*保存i点的父亲节点*/
int vis[MAXN]; /*记录哪些顶点已经求过最短路*/ void input()
{
scanf("%d%d%d%d",&n,&m,&st,&et);
int i,j;
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
weight[i][j]=INF;
weight[i][i]=;
}
int start,end,value;
for(i=;i<m;i++)
{
scanf("%d%d%d",&start,&end,&value);
if(weight[start][end]>value) //去重
weight[start][end]=weight[end][start]=value; //无向图
}
} void dijkstra()
{
int i,j;
memset(vis,,sizeof(vis));
memset(father,,sizeof(father)); //初始化dis数组
for(i=;i<=n;i++)
dis[i]=INF;
dis[st]=; //枚举n个点
for(i=;i<=n;i++)
{
int pos=-; //找到未加入集合的最短路的点
for(j=;j<=n;j++)
if(!vis[j]&&(pos==-||dis[j]<dis[pos]))
pos=j; //标记这个点已经走过
vis[pos]=; //更新dis
for(j=;j<=n;j++)
if(!vis[j]&&(dis[j]>dis[pos]+weight[pos][j]))
{
dis[j]=dis[pos]+weight[pos][j];
father[j]=pos;
}
}
} void output()
{
printf("%d\n",dis[et]);
int que[MAXN];
int cnt=;
int tmp=et;
while(father[tmp]!=)
{
que[cnt++]=tmp;
tmp=father[tmp];
}
int i;
printf("%d",st);
for(i=cnt-;i>=;i--)
printf("-->%d",que[i]);
printf("\n");
} int main()
{
input();
dijkstra();
output();
return ;
}

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

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

分析:

 #include<stack>
#include<stdio.h>
using namespace std; #define MAXN 502
#define INF 0xfffffff int n,m,s,d;
int weight[MAXN][MAXN];
int cost[MAXN][MAXN];
int dis[MAXN];
int cos[MAXN];
int pre[MAXN];
int vis[MAXN]; void init()
{
int i,j;
for(i=;i<n;i++)
{
for(j=;j<n;j++)
{
weight[i][j]=INF;
cost[i][j]=INF;
}
}
} void input()
{
int i,j; scanf("%d%d%d%d",&n,&m,&s,&d); init(); for(i=;i<m;i++)
{
int st,et,di,co;
scanf("%d%d%d%d",&st,&et,&di,&co);
if(di<weight[st][et])
{
weight[st][et]=weight[et][st]=di;
cost[st][et]=cost[et][st]=co;
}
else if(di==weight[st][et]&&co<cost[st][et])
{
cost[st][et]=cost[et][st]=co;
}
}
} void dijkstra()
{
int i,j; for(i=;i<n;i++)
{
vis[i]=;
pre[i]=-;
dis[i]=weight[s][i];
cos[i]=cost[s][i];
} vis[s]=; int mindist,pos; for(i=;i<n;i++)
{
mindist=INF;
for(j=;j<n;j++)
{
if(!vis[j]&&mindist>dis[j])
{
mindist=dis[j];
pos=j;
}
} vis[pos]=; if(pos==d)
{
return ;
} 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
}
}
} void output()
{
stack<int>sta;
int p=d;
while(p!=-)
{
sta.push(p);
p=pre[p];
} printf("%d",s);
while(!sta.empty())
{
printf(" %d",sta.top());
sta.pop();
} printf(" %d %d\n",dis[d],cos[d]);
} int main()
{
input();
if(s==d)
{
printf("%d %d 0 0\n",s,d);
return ;
}
dijkstra();
output();
return ;
}

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

【图算法】Dijkstra算法及变形的更多相关文章

  1. Dijkstra算法与堆(C++)

    Dijkstra算法用于解决单源最短路径问题,通过逐个收录顶点来确保得到以收录顶点的路径长度为最短.      图片来自陈越姥姥的数据结构课程:https://mooc.study.163.com/l ...

  2. [图论]Dijkstra 算法小结

    Dijkstra 算法小结  By Wine93 2013.11 1. Dijkstra 算法相关介绍 算法阐述:Dijkstra是解决单源最短路径的算法,它可以在O(n^2)内计算出源点(s)到图中 ...

  3. 单源最短路径-Dijkstra算法

    1.算法标签 贪心 2.算法描述 具体的算法描述网上有好多,我觉得莫过于直接wiki,只说明一些我之前比较迷惑的. 对于Dijkstra算法,最重要的是维护以下几个数据结构: 顶点集合S : 表示已经 ...

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

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

  5. 最短路算法之Dijkstra算法通俗解释

    Dijkstra算法 说明:求解从起点到任意点的最短距离,注意该算法应用于没有负边的图. 来,看图. 用邻接矩阵表示 int[][] m = { {0, 0, 0, 0, 0, 0}, {0, 0, ...

  6. 单源最短路径(1):Dijkstra 算法

    一:背景 Dijkstra 算法(中文名:迪杰斯特拉算法)是由荷兰计算机科学家 Edsger Wybe Dijkstra 提出.该算法常用于路由算法或者作为其他图算法的一个子模块.举例来说,如果图中的 ...

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

    侵删https://blog.csdn.net/qq_35644234/article/details/60870719 前言 Nobody can go back and start a new b ...

  8. 最短路径问题的Dijkstra算法

      问题 最短路径问题的Dijkstra算法 是由荷兰计算机科学家艾兹赫尔·戴克斯特拉提出.迪科斯彻算法使用了广度优先搜索解决非负权有向图的单源最短路径问题,算法终于得到一个最短路径树>    ...

  9. 最短路径-迪杰斯特拉(dijkstra)算法及优化详解

    简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...

随机推荐

  1. JUnit4参数化测试实例

    在JUnit中,可以同时使用@RunWith 和 @parameter 注解来为单元测试传递参数. 注意: 在Eclipse中因为版本问题,可能无法使用@parameters(name = " ...

  2. Lua------------------unity关于lua的使用

    关于Lua在Unity 中的使用   对于手机游戏,如果可以在线更新以实现bug修复.新功能添加等等,其好处自不必多说. 通过C#的反射机制,也可以实现某种程度上的脚本级更新,具体可以参考 http: ...

  3. 嵌入式开发之zynq——赛灵思的一款两a9加一fpga芯片的开发板

    没办法,回家入职新公司,做通信的,用到这款zynq加ad9163射频架构的开发版,要我做驱动,这可是初次接触zynq,带fpga的集成芯片,心里还是有点惊喜和忧愁,忧愁怎么最快啃下这个硬骨头,好吧上网 ...

  4. 设置 sqlserver Profiler 只监控 EF的sql执行请求

    当我们用EF执行语句的时候,可以使用 sqlserver Profiler来监控到底执行了哪些sql语句,但是默认他是监控全局的,我们只想监控Ef的语句,这里如下设置 这样就只会监控 EF产生的 sq ...

  5. CentOS 7下彻底卸载MySQL数据库

    转载: https://zhangzifan.com/centos-7-remove-mysql.html

  6. 【WP8】ScrollViewer滑动到底触发器(ListBox失效)

    很多时候会有到底加载更多的需求,而ScrollViewer不支持继承,无法继承它进行扩展,只能通过触发器来控制到底的事件(当然,可以通过UserControl去扩展) 思路:定义一个Trigger,自 ...

  7. JUC回顾之-ArrayBlockingQueue底层实现和原理

    ArrayBlockingQueue的原理和底层实现的数据结构 : ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列,可以按照 FIFO(先进先出)原则对元素进行排序. 线程安 ...

  8. Unity打包IOS和Android以及之间的交互

    1.导出的Xcode工程 主要讲解Unity导出的Xcode工程的目录结构 2.导出的Android-Eclipse工程 主要讲解Unity导出的Android-Eclipse工程的目录结构 3.导出 ...

  9. bat 变量作用域

    set answer=one if true equ true ( set answer=two echo %answer% ) echo Argument is %answer% pause

  10. Golang优秀开源项目汇总

    https://blog.csdn.net/hackstoic/article/details/52008307