hdu 2066 一个人的旅行 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
题目意思:给出T条路,和草儿家相邻的城市编号,以及草儿想去的地方的编号。问从草儿家到达草儿想去的地方的最短时间是多少。
一开始自己写的只能处理单边出发的情况,对于以下这幅图,只能处理箭头所示的方向,不能向下,于是不知道为什么出现了百年难得一遇的Runtime Error(ACCESS_VIOLATION)!
10 2 3
1 3 5
3 8 4
2 5 2
5 8 3
1 4 7
4 9 12
9 10 2
2 9 4
2 6 1
10 6 1
1 2
8 9 10
我的答案是INF。= =...。这个答案应该是2。之所以第一组数据能过,是因为它只需要从编号1走即能找到最小值,而上图是需要从编号2走才可以找到最小值。
于是只能看discuss了。yk所讲的无节操!!!看完大受启发。
dijkstra 算法本质上只能求一个点到其他所有点的最短距离。那么就需要把问题转化为单源点。可以人为地认为编号为0的点是草家,由于跟草家直接相连的点距离为0,那么可以把这些点归为源点。至于草儿想去的地方有多个,把这多个点也人为地归为终点,单独设多个点n,把这些所谓的终点连到n点里。(这个n点代码有说)。那题目就转化为从点0到点n的最短时间是多少。
题目中还有一个需要注意的地方,这句话:a,b 之间可能有多条路。也就是说两点之间相连的路有多条,我们需要选择把最短的那条路的时间记录下来。
还有就是TLE 的情况了。if 循环里面对map[i][j]初始化时,千万不能等于maxn(1000 + 5)!TLE了n次!!!
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std; const int INF = << ; // INF 的设置一定要足够的大
const int maxn = + ;
int dist[maxn], map[maxn][maxn], vis[maxn];
int T, S, D, n; void Init()
{
for (int i = ; i < maxn; i++) // 只能小于,不能等于,否则会TLE!!
{
for (int j = ; j < maxn; j++) // 只能小于,不能等于, 否则会TLE!!
map[i][j] = (i == j ? : INF);
}
int st, end, time;
n = ;
for (int i = ; i < T; i++)
{
scanf("%d%d%d", &st, &end, &time);
if (map[st][end] > time) // 有重边
map[st][end] = map[end][st] = time;
// 找出最大边的编号
n = max(n, max(st, end));
}
n++; // 假设是理想中的终点(比最大的顶点大1)的编号
for (int i = ; i < S; i++)
{
scanf("%d", &st);
map[][st] = map[st][] = ; // 草儿家到相邻城市的距离为0
}
for (int i = ; i < D; i++)
{
scanf("%d", &st);
map[st][n] = map[n][st] = ; // 想去的地方到理想中的终点距离为0
}
} void Dijkstra()
{
for (int i = ; i <= n; i++) // 从0改为1
dist[i] = map[][i]; // 以草儿家和她相邻的点作为起点,求出该起点到相邻点的时间
memset(vis, , sizeof(vis));
for (int i = ; i <= n; i++) // 0 改为 1 也行
{
int u;
int maxx = INF;
for (int j = ; j <= n; j++)
{
if (!vis[j] && dist[j] < maxx)
maxx = dist[u=j];
}
vis[u] = ;
for (int j = ; j <= n; j++)
{
if (dist[j] > dist[u] + map[u][j])
dist[j] = dist[u] + map[u][j];
}
}
} int main()
{
while (scanf("%d%d%d", &T, &S, &D) != EOF)
{
Init();
Dijkstra();
printf("%d\n", dist[n]);
}
return ;
}
hdu 2066 一个人的旅行 解题报告的更多相关文章
- hdu 2066 一个人的旅行
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2066 一个人的旅行 Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷 ...
- HDU 2066 一个人的旅行 最短路问题
题目描述:输入的第一行有三个数,T,S,D,T表示一共有多少条线路,S表示起点的个数,D表示终点的个数,接下来就是输入T条路的信息了,要你判断从多个起点中任意一个到多个终点中的任意的一个的最短距离是多 ...
- 题解报告:hdu 2066 一个人的旅行
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...
- hdu 2066 一个人的旅行 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066 题意分析:以草儿家为原点,给出城市间相互抵达的时间,给出草儿想去的城市,求最短时间.典型的单源最 ...
- HDU 2066 一个人的旅行(dijkstra水题+判重边)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066 题目大意:输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有 ...
- hdu 2066 一个人的旅行(最短路问题)
最短路································· 类似的问题还有好多不会!慢慢学吧!!!!. 进步,哪怕每天一点也行! (恋爱不是小事,确实小事的积累!(听着酷狗音乐台说的,很 ...
- hdu - 2066 一个人的旅行(基础最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=2066 把与草儿相连的城市最短距离置为0,然后进行dijkstra,在t个城市里找出距离最近的一个即可. #inc ...
- hdu 1002.A + B Problem II 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002 题目意思:就是大整数加法. 两年几前做的,纯粹是整理下来的. #include <stdi ...
- HDU 2066 一个人的旅行(单源最短路SPFA)
Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还 ...
随机推荐
- Python入门--7--元祖:列表的顽固亲戚
一.创建和访问一个元祖 zheshiyige_yuanzu=(1,2,3,4,5,6) #创建一个元祖 zheshiyige_yuanzu[1] #打印第二个元素 zheshiyige_yuanzu[ ...
- Lucene 6.5.0 入门Demo
Lucene 6.5.0 要求jdk 1.8 1.目录结构: 2.数据库环境: private int id; private String name; private float price; pr ...
- OC-为何用copy修饰block
简单来说,block就像一个函数指针,指向我们要使用的函数. 就和函数调用一样的,不管你在哪里写了这个block,只要你把它放在了内存中(通过调用存在这个block的方 法或者是函数),不管放在栈中还 ...
- 2017 ACM/ICPC Asia Regional Beijing Online 记录
题目链接 Beijing
- java集合系列之ArrayList源码分析
java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...
- Java8 时区DateTime API
原文:http://www.yiibai.com/java8/java8_zoneddateapi.html 时区日期时间的API正在使用当时区要被考虑时. 让我们来看看他们的操作. 选择使用任何编辑 ...
- Android studio 升级,不用下载完整版,完美更新到2.0
Android studio 2.0 公布已有一旦时间,据说,速度大大提高了.但是一直没有尝试更新,看到大家相继更新,所以迫不及待就准备更新,但是.更新之路确实异常坎坷.询问度娘,千奇百怪的问题接憧而 ...
- java cup占用高分析脚本
[was@dmgr ita-scripts]$ vi java_analys.sh PID=$1 ; ps -mp $PID -o THREAD,tid,time | awk -F " ...
- 【转载】C#之C#、.NET Framework、CLR的关系
C#..NET Framework.CLR的关系 很多人没有将C#..NET Framework(.NET框架).CLR(Common Language Runtime,公共语言运行库)这三者之间的关 ...
- 2016/05/25 PHP mysql_insert_id() 函数 返回上一步 INSERT 操作产生的 ID
定义和用法 mysql_insert_id() 函数返回上一步 INSERT 操作产生的 ID. 如果上一查询没有产生 AUTO_INCREMENT 的 ID,则 mysql_insert_id() ...