最短路问题-- Dijkstra Choose the best route
Choose the best route
Problem Description
Input
Each case begins with three integers n, m and s,(n<1000,m<20000,1=<s<=n) n stands for the number of bus stations in this city and m stands for the number of directed ways between bus stations .(Maybe there are several ways between two bus stations .) s stands for the bus station that near Kiki’s friend’s home.
Then follow m lines ,each line contains three integers p , q , t (0<t<=1000). means from station p to station q there is a way and it will costs t minutes .
Then a line with an integer w(0<w<n), means the number of stations Kiki can take at the beginning. Then follows w integers stands for these stations.
Output
const int INF = 1e9;
bool hasFind[maxn];
for (int i = ;i<= n ;i++)
dist[i] = INF;
dist[sNode] = ;
memset(hasFind,,sizeof hasFind);
hasFind[sNode] = true;
具体流程为:
for (int i = ;i< n- ;i++){
int nId = - ;
for (int j = ;j< n ;j++){
if (!hasFind[j]){
if (nId == -)
nId = j;
else if (dist[j]<dist[nId])
nId = j;
}
}
hasFind[nId] = true;
for (int i = ;i< node[nId].size() ;i++){
int nextId = node[nId][i].nextId;
if (node[nId][i].dist + dist[nId]< dist[nextId]){
dist[nextId] = node[nId][i].dist + dist[nId];
que.push(nextId);
}
}
}
时间复杂度 节点个数 $N$,边个数 $M$ $O$($N\times N$)
举例 • 求所有节点到节点 1 的最短距离

1. 初始化
• 将源节点 1,放入已获取最短路径集合, 集合变为 {1}
• 未获取最短路径节点结合 {2,3,4,5}
• 根据节点 1 来更新所有节点距离源节点的距离 $dist$

2. 流程
(a) $step$ 1:
• 从未获取最短路径节点结合 {2,3,4,5} 中,选取距离源节点最 近的节点 3
• 将节点 3,放入已获取最短路径集合, 集合变为 {1,3}
• 根据节点 3 来更新所有节点距离源节点的距离 $dist$

(b) $step$ 2:
• 从未获取最短路径节点结合 {2,4,5} 中,选取距离源节点最 近的节点 2
• 将节点 2,放入已获取最短路径集合, 集合变为 {1,2,3}
• 根据节点 2 来更新所有节点距离源节点的距离 $dist$

(c) $step$ 3:
• 从未获取最短路径节点结合 {4,5} 中,选取距离源节点最近 的节点 4
• 将节点 4,放入已获取最短路径集合, 集合变为 {1,2,3,4}
• 根据节点 4 来更新所有节点距离源节点的距离 $dist$

(d) $step$ 4:
• 从未获取最短路径节点结合 {5} 中,选取距离源节点最近的 节点 5
• 将节点 5,放入已获取最短路径集合, 集合变为 {1,2,3,4,5}
• 根据节点 5 来更新所有节点距离源节点的距离 $dist$

(e) 终止条件,所有节点都放入到了已获取最短路径集合。
把所有部分合并在一起得到一段代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define Inf 0x3f3f3f3f using namespace std;
int map[][];
int vis[],dis[];
int n,m;//n个点,m条边
void Init ()
{
memset(map,Inf,sizeof(map));
for(int i=;i<=n;i++)
{
map[i][i]=;
}
}
void Getmap()
{
int u,v,w;
for(int t=;t<=m;t++)
{
scanf("%d%d%d",&u,&v,&w);
if(map[u][v]>w)
{
map[u][v]=w;
map[v][u]=w;
}
}
} void Dijkstra(int u)
{
memset(vis,,sizeof(vis));
for(int t=;t<=n;t++)
{
dis[t]=map[u][t];
}
vis[u]=;
for(int t=;t<n;t++)
{
int minn=Inf,temp;
for(int i=;i<=n;i++)
{
if(!vis[i]&&dis[i]<minn)
{
minn=dis[i];
temp=i;
}
}
vis[temp]=;
for(int i=;i<=n;i++)
{
if(map[temp][i]+dis[temp]<dis[i])
{
dis[i]=map[temp][i]+dis[temp];
}
}
}
} int main()
{ scanf("%d%d",&m,&n);
Init();
Getmap();
Dijkstra(n);
printf("%d\n",dis[]);
return ;
}
这道题的代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <cstdlib>
using namespace std; const int INF=0x3f3f3f3f;
const int N=;
int mp[N][N];
int dis[N];
int vis[N];
int m;
int n;
int dijstra()
{
memset(dis,0x3f,sizeof(dis));
memset(vis,,sizeof(vis));
dis[]=;
for(int i=;i<=n;i++)
{
int k=;
int mini=INF;
for(int j=;j<=n;j++)
{
if(!vis[j]&&mini>dis[j])
mini=dis[k=j];
}
vis[k]=;
if(k==m) return dis[m];
for(int j=;j<=n;j++)
{
if(vis[j]||mp[k][j]==INF) continue;
dis[j]=min(dis[j],dis[k]+mp[k][j]);
}
}
return dis[m];
}
int main()
{
int s; //已修好的路有几条
while(~scanf("%d%d%d",&n,&s,&m)) //终点是m,最远的点是n
{
memset(mp,INF,sizeof(mp));
while(s--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(mp[a][b]>c)
mp[a][b]=c;
}
int d;
scanf("%d",&d);
while(d--)
{
int x;
scanf("%d",&x);
mp[][x]=;
}
int k=dijstra();
if(k==INF) printf("-1\n");
else printf("%d\n",dijstra());
}
return ;
}
最短路问题-- Dijkstra Choose the best route的更多相关文章
- hdu 2680 Choose the best route (dijkstra算法 最短路问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Time Limit: 2000/1000 MS ( ...
- hdu 2680 Choose the best route
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Description One day , Kiki ...
- HDU2680 Choose the best route 最短路 分类: ACM 2015-03-18 23:30 37人阅读 评论(0) 收藏
Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- HDU2680 Choose the best route 2017-04-12 18:47 28人阅读 评论(0) 收藏
Choose the best route Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Othe ...
- hdu-2680 Choose the best route(最短路)
题目链接: Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- Choose the best route(最短路)dijk
http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Time Limit: 2000/1000 MS (Java/ ...
- HDU 2680 Choose the best route(多起点单终点最短路问题)题解
题意:小A要乘车到s车站,他有w个起始车站可选,问最短时间. 思路:用Floyd超时,Dijkstra遍历,但是也超时.仔细看看你会发现这道题目好像是多源点单终点问题,终点已经确定,那么我们可以直接转 ...
- Choose the best route HDU杭电2680【dijkstra算法 || SPFA】
http://acm.hdu.edu.cn/showproblem.php?pid=2680 Problem Description One day , Kiki wants to visit one ...
- HDU 2680 Choose the best route 最短路问题
题目描述:Kiki想去他的一个朋友家,他的朋友家包括所有的公交站点一共有n 个,一共有m条线路,线路都是单向的,然后Kiki可以在他附近的几个公交站乘车,求最短的路径长度是多少. 解题报告:这道题的特 ...
随机推荐
- 洛谷P1000 超级玛丽游戏(洛谷新手村1-1-1)
题目背景 本题是洛谷的试机题目,可以帮助了解洛谷的使用. 建议完成本题目后继续尝试P1001.P1008. 题目描述 超级玛丽是一个非常经典的游戏.请你用字符画的形式输出超级玛丽中的一个场景. *** ...
- 利用ZXing.Net生成和识别二维码
ZXing.Net:ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库. github:https://github.com/micjahn/ZXing.Net 直接将字符 ...
- P1050 螺旋矩阵
P1050 螺旋矩阵 转跳点:
- CodeForces - 755B PolandBall and Game(博弈)
题意:A和B两人每人都熟悉一些单词.A先开始,每人说一个单词,单词不能与两人之前说过的所有单词重复,谁无话可说谁输.两人可能有共同会的单词. 分析:因为要让对方尽量无单词可说,所以每个人优先说的都是两 ...
- Result Maps collection already contains value for com.xxx.x.dao.xxxMapper.Bas
springboot启动时候,报错如下: Result Maps collection already contains value for com.xxx.xx.dao.xxxxxMapper.Ba ...
- 配置tomcat、nginx实现反向代理(需操作)
配置tomcat.nginx实现反向代理现在我想通过nginx访问tomcat 这就要我们去修改nginx的核心配置文件,在其目录下的conf文件夹下的nginx.conf文件,那么首先我们就要了解该 ...
- SpringBoot#RestControllerAdvice
__震惊! 不可避免的访问一些控制器会产生一些异常,这些异常不经处理传递到前台页面,会很难看. 涉及到的注解: org.springframework.web.bind.annotation.Rest ...
- 161-PHP 文本替换函数str_replace(二)
<?php $str='Hello world!'; //定义源字符串 $search='o'; //定义将被替换的字符 $replace='O'; //定义替换的字符串 $res=str_re ...
- Essay写作如何提升自己的辩驳水平?
辩证思维在英文写作上的表现方式有许多种,今天来讲讲Counterargument&Rebut,广泛用于英文写作和口语辩论.其作用就是通过辩驳和你论点相反的意见,来突出自己的论点更正确. 话说衡 ...
- js基础学习之-js全局对象
声明的三种方式: 第一种: var test; //或var test = 5; 第二种: test = 5; 第三种: window.test; //或window.test = 5; //只是使用 ...