Choose the best route(最短路)dijk
http://acm.hdu.edu.cn/showproblem.php?pid=2680
Choose the best route
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 9602 Accepted Submission(s): 3111
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.
1 2 2
1 5 3
1 3 4
2 4 7
2 5 6
2 3 5
3 5 1
4 5 1
2
2 3
4 3 4
1 2 3
1 3 4
2 3 2
1
1
-1
题解:最短路 注意有重边,这里介绍一种用链表存 的时候可以不用考虑重边,方法就是将所有的边都标记为未访问,然后将其他边的值标记成INF,将开始那条边的值标记成0 ,然后加入n边,每次更新的时候就不用考虑重边了。
这个题因为数据量特别的大,dijk的算法本身是O (n^2)的,查询的时候调用n次dijk所以总共是O(n^3),所以最后会超时,可以逆向思维,因为终点是已知的所以从终点开始dijk一次后找到所有的已知起点中距离最小的点就可以了。
注意这个题中是有向边。
下面是代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 2000
#define M 400000
#define INF 0x1fffffff
struct Edge{
int to ;
int v;
int next;
}edge[M];
int head[N];
int Ecnt;
void init()
{
Ecnt = ;
memset(head,-,sizeof(head));
}
void add(int from , int to ,int v)
{
edge[Ecnt].to = to;
edge[Ecnt].v = v;
edge[Ecnt].next = head[from];
head[from] = Ecnt++;
}
int dist[N];
bool p[N];
void dijk(int s, int n)
{
int i , j , k ;
for(i = ;i <= n ;i++)
{
p[i] = false;
dist[i] = INF;
}
//p[s] = true;
dist[s] = ; for( i = ; i < n ; i++)
{
int Min = INF ;
int k = ;
for( j = ; j <= n ; j++)
{
if(!p[j]&&dist[j]<Min)
{
Min = dist[j];
k = j;
}
}
if(Min == INF ) return ;
p[k] = true;
for(j = head[k]; j != - ; j = edge[j].next)
{
Edge e = edge[j];
if(!p[e.to]&&dist[e.to]>dist[k]+e.v)
dist[e.to] = dist[k]+e.v;
}
}
}
int main()
{
int n , m , s ;
while(~scanf("%d%d%d",&n,&m,&s))
{
init();
for(int i = ;i < m ; i++)
{
int p , q , t ;
scanf("%d%d%d",&p,&q,&t);
add(q,p,t);//逆向扫描,所以逆向加边
}
dijk(s,n);
int ss;
scanf("%d",&ss);
int ans = INF;
for(int i = ;i < ss; i++)
{
int w ;
scanf("%d",&w);
ans = min(ans,dist[w]);
}
if(ans==INF) printf("-1\n");
else printf("%d\n",ans);
}
return ;
}
Choose the best route(最短路)dijk的更多相关文章
- 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 ...
- hdu-2680 Choose the best route(最短路)
题目链接: Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- hdu2680 Choose the best route 最短路(多源转单源)
此题中起点有1000个,边有20000条.用链式前向星建图,再枚举起点用SPFA的话,超时了.(按理说,两千万的复杂度应该没超吧.不过一般说计算机计算速度 1~10 千万次/秒.也许拿最烂的计算机来卡 ...
- 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 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 (dijkstra算法 最短路问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Time Limit: 2000/1000 MS ( ...
- 最短路问题-- Dijkstra Choose the best route
Choose the best route Problem Description One day , Kiki wants to visit one of her friends. As she i ...
- BZOJ 1266: [AHOI2006]上学路线route(最短路+最小割)
第一问最短路.第二问,先把最短路的图建出来(边(u,v)满足d[s->u]+d[v->t]+d(u,v)==最短路径长度,就在图中,可以从源点和汇点分别跑一次最短路得到每个点到源点和汇点的 ...
- 最短路<dijk>
题意: 有n个城市,有m条路,给出每条路的出发和结束的城市及长度,求从第一个城市到最后一个城市的最短路.按格式输出. power oj 2443 题解: 标准dijk算法. #include<c ...
随机推荐
- [Count the numbers satisfying (m + sum(m) + sum(sum(m))) equals to N]
Given an integer N, the task is to find out the count of numbers M that satisfy the condition M + su ...
- cat/tac/more/less 命令详解
cat:(http://www.cnblogs.com/peida/archive/2012/10/30/2746968.html) *cat主要有三大功能:1.一次显示整个文件:cat filena ...
- 修改placeholder的样式
input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #666; } input:-moz-pl ...
- COMPUTE子句和Group By
首先声明一下,这个COMPUTE语法在SQLServer 2012之后,就废弃使用了,详情请看https://msdn.microsoft.com/librar ...
- Robot Framework学习笔记(十)------Selenium2Library库
一.安装selenium2library库 如果已经安装了pip,则使用管理员模式打开windows命令行,输入pip install robotframework-selenium2library, ...
- JS大小写字母转换
var a = "ABCd"; console.log(a.toLowerCase());//转换成小写 console.log(a.toUpperCase());//转换成大写
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
- Python正则表达式返回首次匹配到的字符及查询的健壮性
re.findall(pattern,string)会搜索所有匹配的字符,返回的是一个列表,获取首个匹配需要re.findall(pattern,string)[0]访问, 但是如果findall没匹 ...
- python键盘读入的input方法
今天了解了一下python,学了一些小东西,便存下了: input函数(raw_input在3.0版本没有,所以就不说了!) num = input ("输入一个数:") |备注 ...
- PHP读取excel中地址实现多文件下载
PHP文件下载有单文件和多文件之分,如果是单文件写个方法可以实现,但是如果想循环下载多个文件我试验是没有成功.先说单文件的下载,方法如下: function downfile($fileurl) { ...