博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【hdu 2544最短路】【Dijkstra算法模板题】
阅读量:4966 次
发布时间:2019-06-12

本文共 2324 字,大约阅读时间需要 7 分钟。

Dijkstra算法

分析

Dijkstra算法适用于边权为正的情况。它可用于计算正权图上的单源最短路( Single-Source Shortest Paths, SSSP) , 即从单个源点出发, 到所有结点的最短路(这样最后返回你想要的那个节点对应的距离即可)。 该算法同时适用于有向图和无向图。

其伪代码如下:

清除所有点的标号设d[0]=0, 其他d[i]=INF         //INF被定义为一个很大的数字循环n次 {在所有未标号结点中, 选出d值最小的结点x给结点x标记对于从x出发的所有边(x,y), 更新d[y] = min{d[y], d[x]+w(x,y)}        //w(x,y)是指边xy对应的权值}

模板

可以根据上面的伪代码帮助理解

int Dijk(){    memset(vis, 0, sizeof(vis));    memset(d, 0, sizeof(d));    for(int i = 1; i <= N; i++)        d[i] = ((i == 1) ? 0 : INF);        //注意这里INF一定要设置的很大         //这里的条件设置根据题意自行判断    for(int i = 1; i <= N; i++)    {        int x, minn = INF;        for(int j = 1; j <= N; j++)        {            if(!vis[j] && d[j] < minn)          //在所有未标号结点中, 选出d值最小的结点x            {                minn = d[j];                x = j;            }        }        vis[x] = 1;           //标记它        for(int y = 1; y <= N; y++)            d[y] = min(d[y], d[x] + route[x][y]);    }    return d[...];              //根据题意要求进行返回相应的值}

以上内容参考自刘汝佳的《算法竞赛入门经典》

AC代码

#include
#include
#include
#include
using namespace std;const int maxn = 100 + 10;const int INF = 0x3f3f3f3f;int N, M;int a, b, c;int route[maxn][maxn], d[maxn];int vis[maxn];int Dijk(){ memset(vis, 0, sizeof(vis)); memset(d, 0, sizeof(d)); for(int i = 1; i <= N; i++) d[i] = ((i == 1) ? 0 : INF); //这里的条件设置根据题意自行判断 for(int i = 1; i <= N; i++) { int x, minn = INF; for(int j = 1; j <= N; j++) { if(!vis[j] && d[j] < minn) //在所有未标号结点中, 选出d值最小的结点x { minn = d[j]; x = j; } } vis[x] = 1; //标记它 for(int y = 1; y <= N; y++) d[y] = min(d[y], d[x] + route[x][y]); } return d[N];}void init(){ for(int i = 1; i <= N; i++) { for(int j = i + 1; j <= N; j++) route[i][j] = route[j][i] = INF; }}int main(){// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout); while(cin >> N >> M && N && M) { init(); for(int i = 0; i < M; i++) { cin >> a >> b >> c; route[a][b] = route[b][a] = c; } int minn = Dijk(); cout << minn << endl; }}

转载于:https://www.cnblogs.com/KeepZ/p/11374360.html

你可能感兴趣的文章
无缝滚动js (手写通俗易懂)
查看>>
色彩對比分析
查看>>
五. 面向对象高级特性7. 泛型通配符和类型参数的范围
查看>>
hadoop开发库webhdfs使用介绍
查看>>
document对象(二)
查看>>
Ajax中Put和Delete请求传递参数无效的解决方法(Restful风格)
查看>>
PHP——0127加登录页面,加查询,加方法,加提示框
查看>>
日期工具类
查看>>
this
查看>>
自由群,外代数和泛包络代数
查看>>
Centos 7 下部署Django + uWSGI + Nginx
查看>>
MVC系列学习(三)-EF的延迟加载
查看>>
C++函数调用方式约定stdcall,cdecl,pascal,naked,thiscall,fastcall
查看>>
HDU 2846(Trie树)
查看>>
接口测试必备技能之入门到上手
查看>>
js排序算法02——插入排序
查看>>
数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)...
查看>>
SpringDataRedis java.net.UnknownHostException: 127.0.0.1 错误
查看>>
Spring Boot配置文件
查看>>
你的flume-ng的第一篇博客
查看>>