Dijkstra是求最短路径,从未选过点中找最短的一条路,然后更新其他点到起点的距离。例如选择的最短点为k,则dj[k]表示起点到k之间的距离,此时更新其他点到起点的距离,dj[j] = min(dj[j],dj[k]+dj[k][j]);dj[j]比较原来的长度与经过k掉再到j点的长度,取最小。

模板如下:

void Dijkstra()
{memset(vis,0,sizeof(vis));for(int i=0;i<=n;++i)dj[i] = Map[0][i];vis[0] = 1;for(int i=1;i<=n;++i){int mindj = INF;int pos;for(int j=1;j<=n;++j){if(dj[j]<mindj&&!vis[j]){mindj = dj[j];pos = j;}}vis[pos] = 1;for(int j=1;j<=n;++j){if(!vis[j] && dj[j] > dj[pos] + Map[pos][j])dj[j] = dj[pos] + Map[pos][j];}}
}

View Code

hdu2066

由于多个起点,只要设置多个起点到0起点的距离为0即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF (1<<30)
#define N   (1000+100)int Map[N][N];
int n;
int dj[N],vis[N];void Dijkstra()
{memset(vis,0,sizeof(vis));for(int i=0;i<=n;++i)dj[i] = Map[0][i];vis[0] = 1;for(int i=1;i<=n;++i){int mindj = INF;int pos;for(int j=1;j<=n;++j){if(dj[j]<mindj&&!vis[j]){mindj = dj[j];pos = j;}}vis[pos] = 1;for(int j=1;j<=n;++j){if(!vis[j] && dj[j] > dj[pos] + Map[pos][j])dj[j] = dj[pos] + Map[pos][j];}}
}int main()
{int t,s,d;while(~scanf("%d%d%d",&t,&s,&d)){n = 0;for(int i=0;i<N;++i)for(int j=0;j<N;++j){if(i != j)  Map[i][j] = INF;else Map[i][j] = 0;}for(int i=0;i<t;++i){int a,b,time;scanf("%d%d%d",&a,&b,&time);Map[a][b] = Map[b][a] = min(Map[a][b],time);n = max(max(a,b),n);}int src[N],dst[N];for(int i=0;i<s;++i){scanf("%d",&src[i]);Map[0][src[i]] = 0;}for(int i=0;i<d;++i)scanf("%d",&dst[i]);Dijkstra();int res = INF;for(int i=0;i<d;++i)res = min(res,dj[dst[i]]);printf("%d\n",res);}return 0;
}

View Code

hdu1874

跟2066一样,每次两点之间会有多条路,需要取最小的那条算,无语。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF (1<<30)
#define N (200+10)int Map[N][N];
int n;
int dj[N],vis[N];void Dijkstra()
{memset(vis,0,sizeof(vis));for(int i=0;i<=n;++i)dj[i] = Map[0][i];vis[0] = 1;for(int i=1;i<=n;++i){int pos,mindj = INF;for(int j=1;j<=n;++j)if(!vis[j]&&dj[j]<mindj){mindj = dj[j];pos = j;}vis[pos] = 1;for(int j=1;j<=n;++j)if(!vis[j])dj[j] = min(dj[j],dj[pos]+Map[pos][j]);}
}int main()
{int m;while(~scanf("%d%d",&n,&m)){for(int i=0;i<=n;++i)for(int j=0;j<=n;++j){if(i != j) Map[i][j] = INF;else Map[i][j] = 0;}for(int i=0;i<m;++i){int a,b,x;scanf("%d%d%d",&a,&b,&x);Map[a+1][b+1] = Map[b+1][a+1] = min(Map[a+1][b+1],x);}int s,t;scanf("%d%d",&s,&t);++s,++t;Map[0][s] = 0;Dijkstra();if(dj[t] >= INF) printf("-1\n");else printf("%d\n",dj[t]);}return 0;
}

View Code

hdu3790

二维最短路径,求最短路径,如果最短路径有多条,求费用最少。原理一样,不难

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF (1<<30)
#define  N (1000+10)int n,m;
int Map[N][N],Price[N][N];
int dj[N],cost[N],vis[N];void Dijkstra()
{memset(vis,0,sizeof(vis));vis[0] = 1;for(int i=0;i<=n;++i){dj[i] = Map[0][i];cost[i] = Price[0][i];}for(int i=1;i<=n;++i){int mindj=INF,pos;for(int j=1;j<=n;++j)if(!vis[j]&&dj[j]<mindj){mindj = dj[j];pos = j;}vis[pos] = 1;for(int j=1;j<=n;++j)if(!vis[j]&&(dj[j] > dj[pos] + Map[pos][j]||(dj[j]==dj[pos] + Map[pos][j] &&cost[j] > cost[pos] + Price[pos][j]))){dj[j] = dj[pos] + Map[pos][j];cost[j] = cost[pos] + Price[pos][j];}}
}int main()
{while(~scanf("%d%d",&n,&m),n&&m){for(int i=0;i<=n;++i)for(int j=0;j<=n;++j){if(i != j) Map[i][j] = INF;else Map[i][j] = 0;}memset(Price,0,sizeof(Price));for(int i=0;i<m;++i){int a,b,d,p;scanf("%d%d%d%d",&a,&b,&d,&p);if(d < Map[a][b] || (d==Map[a][b]&&p < Price[a][b])){Map[a][b] = Map[b][a] = d;Price[a][b] = Price[b][a] = p;}}int s,t;scanf("%d%d",&s,&t);Map[0][s] = 0;Dijkstra();printf("%d %d\n",dj[t],cost[t]);}return 0;
}

View Code

hdu2112

用map把地名换成数字。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std;
#define INF (1<<30)
#define N    (160)map<string,int> msi;
int Map[N][N];
int cnt;
int vis[N],dj[N];
void Dijkstra()
{memset(vis,0,sizeof(vis));vis[0] = 1;for(int i=0;i<=cnt;++i)dj[i] = Map[0][i];for(int i=1;i<=cnt;++i){int pos,mindj = INF;for(int j=1;j<=cnt;++j)if(!vis[j] && dj[j] < mindj){pos = j;mindj = dj[j];}vis[pos] = 1;for(int j=1;j<=cnt;++j)if(!vis[j]) dj[j] = min(dj[j],dj[pos]+Map[pos][j]);}}
int main()
{int n;while(~scanf("%d",&n),n!=-1){for(int i=0;i<N;++i)for(int j=0;j<N;++j){if(i!=j) Map[i][j] = INF;else Map[i][j] = 0;}msi.clear();char a[40],b[40];int ia,ib,t,dst;scanf("%s%s",a,b);cnt = 0;msi[a] = ++cnt;dst = (strcmp(a,b)==0?cnt:++cnt);msi[b] = dst;Map[0][1] = 0;for(int i=0;i<n;++i){scanf("%s%s%d",a,b,&t);pair<map<string,int>::iterator,bool>pmb = msi.insert(pair<string,int>(a,0));if(pmb.second) msi[a] = ++cnt;pmb = msi.insert(pair<string,int>(b,0));if(pmb.second) msi[b] = ++cnt;//换成下面部分也可以/*(if(!msi[a])msi[a] = ++cnt;if(!msi[b])msi[b] = ++cnt;*/ia = msi[a];ib = msi[b];if(t < Map[ia][ib])Map[ia][ib] = Map[ib][ia] = t;}Dijkstra();if(dj[dst] >= INF) printf("-1\n");else printf("%d\n",dj[dst]);}return 0;
}

View Code

转载于:https://www.cnblogs.com/jlyg/p/7404082.html

Dijkstra模板相关推荐

  1. P4779 【模板】单源最短路径(标准版)(dijkstra模板)

    dijkstra模板 输入: 4 6 1 1 2 2 2 3 2 2 4 1 1 3 5 3 4 3 1 4 4 输出: 0 2 4 3 堆优化版本 #include<bits/stdc++.h ...

  2. Dijkstra模板(java)

    Dijkstra模板 再求单源最短路径时候,经常会用到Dijkstra算法,在某些数据量小的情况下bfs或者dfs或许可以得到结果,但是一旦结果大的时候常规搜索就很难在规定时间内得到答案. Dijks ...

  3. 【dijkstra模板】旅游规划 (25 分)

    立志用最少的代码做最高效的表达 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条 ...

  4. 最短路 dijkstra模板

    最短路 dijkstra模板 #pragma warning(disable:4996) #include<iostream> #include<string> #includ ...

  5. PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!

    文章目录 题目分析 题目链接 题目分析 原题: 来源:acwing 分析: 建图:所有能走到的点之间建立一条边,比如下面一条地铁线路有4站,它们是相通的,两两之间建一条边,边权是经过的站点数. 下面考 ...

  6. vector邻接表建图+dijkstra模板

    本文节点的编号从0开始计算 思路 dijkstra伪算法(未优化)源点到自己的距离为0,其余点到源点的距离为无穷大 记录当前节点now为源点s 循环下面的步骤V次,V是结点的个数now标记已访问遍历n ...

  7. 城市间紧急救援 (25 分)【dijkstra模板 超时原因】

    立志用最少的代码做最高效的表达 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度 ...

  8. 图论--最短路-- Dijkstra模板(目前见到的最好用的)

    之前的我那个板子,老是卡内存,不知道为什么,我看别人过的那个题都是结构体,我就开始对自己板子做了修改,然后他奶奶的就过了,而且速度也提高了,内存也小了.(自从用了这个板子,隔壁小孩馋哭了)也不知道为啥 ...

  9. HDU 2544最短路dijkstra模板题

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

最新文章

  1. pandas使用pct_change计算数据列的百分比变化、环比变化率:计算当前元素和前一个元素之间的百分比变化、使用style函数指定format的格式:百分比、缺失值替换、用颜色标注极大值和极小值
  2. 《黑马程序员》认识OC的第一个程序(Objective-c)
  3. hdu5251最小矩形覆盖
  4. [算法]链表的逆序遍历节点
  5. RHCS创建高可用集群apche服务器
  6. 云+X案例展 | 传播类:南方报业数据中台建设,助力“智媒”飞跃发展
  7. wms仓储系统培训_WMS系统在仓储管理中产生的盈利
  8. ASP.NET Core和Blazor Code Venture:配置Azure AD身份验证
  9. SQLAlchemy框架
  10. HNU 实验五 小女孩与楼梯
  11. 折腾kali linux2.0
  12. flex制作一个用户登录框(含验证码)
  13. 面向资源的权限体系设计随想
  14. 数据结构之图的基础知识(二)
  15. 拯救懒癌患者,京东订单自动写评价脚本!
  16. html页面显示不全,小技巧助你解决div+css网页内容显示不完整
  17. 漫画人物头像总是画不好?快看看这些注意点你有没有中招!
  18. C语言---找零问题------程序优化
  19. 华为2020校招软件开发岗全流程,已签约
  20. Ajax跨域请求时出现Access to XMLHttpRequest at ‘xxx‘ from origin ‘xxx‘ has been been blocked by CORS policy

热门文章

  1. Mybatis操作数据库实现主键自增长
  2. Hive之 hive-1.2.1 + hadoop 2.7.4 集群安装
  3. IBM和Lightbend宣布构建新认知开发平台的战略
  4. oracle lob 简单介绍
  5. Application Architecture - Table Data Gateway
  6. 为什么做了梦第二天想不起来_为什么做的梦总是想不起来?科学的解释是……...
  7. python文件的用法_Python文件读写常见用法总结
  8. FOC驱动器和无刷电调的区别
  9. asp.net core选项配置的研究
  10. puppet安装常遇见的问题