最短路问题-- 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可以在他附近的几个公交站乘车,求最短的路径长度是多少. 解题报告:这道题的特 ...
随机推荐
- 050、Java中使用switch判断,使用字符串判断
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 无法识别的配置节 system.webServer
Web.config文件里面加入 <configSections> <section name="system.webServer" type="Sys ...
- pyhton读入Excel和csv数据文件
pyhton读入Excel和csv数据文件#file 数据文件的输入输出操作(主要包括Excel表格和csv表格文件)import pandas as pd #pyhton读入数据必须要导入panda ...
- pacificrack 控制面板登录不上的问题
我今天又试了一下: https://master-stack01.pacificrack.com还是登不上(这个一键烦恼了我一个星期了,但是我今天百度出来了解决办法) 然后用这个就可以了 https ...
- 怎样解题 --解题表(how to solve it)
<怎样解题> 美.波利亚 下面是来自书中的解题表: 理解题目 第一 理解题目 你必须理解题目 未知量是什么?已知数据是什么?条件是什么? 条件有可能满足吗?条件是否可以确定未适量?或者它不 ...
- yeoman 介绍、安装 和 使用
一.介绍.安装 1, 是什么 Yeoman其实是3个工具的总和: ü yo --- 脚手架,自动生成工具 ü Grunt.gulp --- 构建工具 (最初只有grunt,后面gulp火了添加进来 ...
- jrebel插件的激活
转 jrebel idea插件激活,亲测可用: 在jrebel server处,写上: http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc81 ...
- [YOLO]《YOLO9000:Better, Faster, Stronger》笔记
一.简单介绍 YOLO9000(也叫YOLO v2),主要是在YOLO v1的基础上做了改进,而且效果还是比较显著的,在原论文中,作者提到的改进大致包括两个工作: 1.检测性能上的改进,提出了YOLO ...
- 119-PHP调用private成员的方法
<?php class ren{ //定义人类 private $birthday='1990-12-20'; //定义private修饰的成员属性 public function say_bi ...
- 实体映射-------AutoMapper
现在有2个实体(A.B),2个实体中的部分字段是相同的,现在把A实体获取的值赋值给B实体,利用AutoMapper实体映射可以轻松解决 参考 实体中不同名称之间的映射可以这样写 Mapper.Init ...