最短路问题-- 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可以在他附近的几个公交站乘车,求最短的路径长度是多少. 解题报告:这道题的特 ...
随机推荐
- 【转】Spark Streaming 实时计算在甜橙金融监控系统中的应用及优化
系统架构介绍 整个实时监控系统的架构是先由 Flume 收集服务器产生的日志 Log 和前端埋点数据, 然后实时把这些信息发送到 Kafka 分布式发布订阅消息系统,接着由 Spark Streami ...
- C++ 语言程序设计(清华大学)1
1.回文数字判断方法(逆过来数值相等):y=y*10+x%10; x /= 10; return(x==y) 2.int rand(void)函数,所需头文件<cstdlib> ,功能是求 ...
- a标签-伪类
a:link {color: #FF0000} /* 未访问的链接 */ a:visited {color: #00FF00} /* 已访问的链接 */ a:hover {color: #FF00FF ...
- linux下anaconda的安装和使用
1.将python3设置为默认 直接执行这两个命令即可: sudo update-alternatives --install /usr/bin/python python /usr/bin/pyth ...
- maven的概念模型及maven坐标
1.概念模型 项目对象模型:一个maven工程有一个pom.xml文件,通过pom.xml文件定义项目的坐标.项目依赖.项目信息.插件目标等. 依赖管理系统:通过maven的依赖管理对项目所依赖的j ...
- 对jsp中的js进行调试的方法
在js中 输入debugger 就可以了
- MSVCRTD.LIB和LIBCMTD.LIB冲突(转载)
以前经常遇到这个警告信息,因为运行并没有什么问题,所以也没深究.但是耿耿于怀那个“ 0 个错误,0 个警告”的成功提示,在网上搜了一下.原来问题出在默认库的引用选择上. VS2008,项目——属性—— ...
- apache启动错误:Could not reliably determine the server's fully qualified domain name
启动apache遇到错误:httpd: Could not reliably determine the server's fully qualified domain name [root@serv ...
- Sublime Text3 python自动补全问题——Sublime Text3安装Anaconda插件
学习python的时候 在编辑器的选择上会有很多选择,我最终还是选择了sublime text3. 相对于其他编辑器,sublime text有以下特性: 插件多,类似GoSublime,Emmet信 ...
- 快速进阶Vue3.0
在2019.10.5日发布了Vue3.0预览版源码,但是预计最早需要等到 2020 年第一季度才有可能发布 3.0 正式版. 可以直接看 github源码. 新版Vue 3.0计划并已实现的主要架构改 ...