注意:

  1:因为两点之间可能有多条路,所以更新路径长度的时候做一次判断

  if(time < mat[a][b])
    mat[a][b] = mat[b][a] = time;

  2:因为主函数中的数组实际上是在栈中存储的,而栈中内存有限,所以过大的数组不能在栈中开,要设置为全局变量

  比如此题中的矩阵就是10的六次方,我刚开始开到主函数中就不能运行

  3:dijkstra算法记得初始化任意两点之间的距离为无穷

  另外题目还有一个小技巧,在代码的注释中解释

Description

虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
 

Input

输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个; 
接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路) 
接着的第T+1行有S个数,表示和草儿家相连的城市; 
接着的第T+2行有D个数,表示草儿想去地方。
 

Output

输出草儿能去某个喜欢的城市的最短时间。
 

Sample Input

6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
 

Sample Output

9
#include <iostream>
#include <stdio.h>
using namespace std; #define MAXN 1002
#define inf 1000000000
int mat[MAXN][MAXN];//数组太大所以要定义成全局变量,一定要注意注意
typedef int elem_t;
/*
这道题实际上可以用小技巧转化为dijkstra算法
草儿从家里出发,可以去临近城市坐车,那么就可以把草儿家看作起点,草儿家里到所有车站的时间记为0,这样起点就只有一个,
如果把坐车的城市看作起点那就要比较很多次 因为草儿的目的地也有很多,要求所花时间最短的目的地所花的时间
那么就可以设置一个虚拟的目的地,让草儿所有想去的地方到这个虚拟的目的地的距离为0 这样求得的草儿家到虚拟目的地的时间就是题目所要的时间
*/
void dijkstra(int n, int s, elem_t min[], elem_t pre[])
{
int v[MAXN], i, j, k;
for(i = ; i < n; i++)
min[i] = inf, v[i] = , pre[i] = -;
for(min[s] = , j = ; j < n; j++)
{
for(k = -, i = ; i < n; i++)
{
if(!v[i] && (k == - || min[i] < min[k]))
{
k = i;
}
}
for(v[k] = , i = ; i < n; i++)
{
if(!v[i] && min[k] + mat[k][i] < min[i])
min[i] = min[k] + mat[pre[i] = k][i];
}
}
}
int main()
{
int t, s, d;
int min[MAXN], pre[MAXN];
while(scanf("%d%d%d", &t, &s, &d) != EOF)
{
int a, b, time;
//初始化任意两点之间的距离为无穷
for(int i = ; i <= MAXN; i++)
{
for(int j = ; j <= MAXN; j++)
{
mat[i][j] = mat[j][i] = inf;
}
}
for(int i = ; i < t; i++)
{
scanf("%d%d%d", &a, &b, &time);
if(time < mat[a][b])//////////////////////////////////////
mat[a][b] = mat[b][a] = time;
}
int start, e;
for(int i = ; i < s; i++)
{
scanf("%d", &start);
mat[][start] = mat[start][] = ;
}
for(int j = ; j < d; j++)
{
scanf("%d", &e);
mat[e][] = mat[][e] = ;
}
dijkstra(, , min, pre);
printf("%d\n", min[]);
}
return ;
}
 

一个人的旅行(用小技巧转化为dijkstra算法)的更多相关文章

  1. 一个人的旅行 HDU杭电2066【dijkstra算法 || SPFA】

    pid=2066">http://acm.hdu.edu.cn/showproblem.php? pid=2066 Problem Description 尽管草儿是个路痴(就是在杭电 ...

  2. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  3. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

    前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...

  4. 分享两个BPM配置小技巧

    1.小技巧 流程图修改后发布的话版本号会+1,修改次数多了之后可能会导致版本号很高,这个时候可以将流程导出,然后删除对应的流程包再导入,发布数据模型和流程图之后,版本清零 2.小技巧 有的同事入职后使 ...

  5. linux系统维护时的一些小技巧,包括系统挂载新磁盘的方法!可收藏!

    这里发布一些平时所用到的小技巧,不多,不过会持续更新.... 1.需要将history创建硬链接ln 全盘需要备份硬链接 ln /etc/xxx /home/xxx 2.root用户不可以远程 /et ...

  6. JS处理事件小技巧

    今天,就分享一下我自己总结的一些JS的小技巧: ①防止鼠标选中事件 <div class="mask" onselectstart="return false&qu ...

  7. iOS:小技巧(不断更新)

    记录下一些不常用技巧,以防忘记,复制用. 1.获取当前的View在Window的frame: UIWindow * window=[[[UIApplication sharedApplication] ...

  8. css小技巧(1)

    1.-webkit-overflow-scrolling: touch; 解决ios滑动时无缓冲问题 2.::-webkit-scrollbar 设置ios滑动时是否显示滚动条 3.::selecti ...

  9. 最强 Android Studio 使用小技巧和快捷键

    写在前面 本文翻译自 Android Studio Tips by Philippe Breault,一共收集了62个 Android Studio 使用小技巧和快捷键. 根据这些小技巧的使用场景,本 ...

随机推荐

  1. javascript第六课类型转换

    1.parseint(参数): 转换为整数,即使参数中的字符串包含字母数字混合,此方法也会自动一个一个判断和转换   parseInt(参数,进制);将参数通过几进制的方式转为数字 2.parsefl ...

  2. poj 2513 Colored Sticks (trie 树)

    链接:poj 2513 题意:给定一些木棒.木棒两端都涂上颜色,不同木棒相接的一边必须是 同样的颜色.求能否将木棒首尾相接.连成一条直线. 分析:能够用欧拉路的思想来解,将木棒的每一端都看成一个结点 ...

  3. 【每天一个Linux命令】13. Linux中whereis命令的用法

      命令用途 whereis命令用来查找命令的位置,包括执行文件.源代码和手册页文件 命令用法 1. 查找指定命令<command>的位置,包括执行文件.源代码和手册页文件 格式:wher ...

  4. 自定义和扩展 SharePoint 2010 Server 功能区

    了解构成 SharePoint 2010 服务器功能区的组件以及如何通过演练两个功能区自定义项方案来自定义功能区. 适用范围: Microsoft SharePoint Foundation 2010 ...

  5. .net的页面在大并发下偶尔出现503错误

    我们开发了一个回调页面,由一个工具负责调用,由于压力非常大,回调页面通过6台服务器负载均衡的: 最近业务系统又再次扩容,回调页面压力成倍增加,在高峰时间段偶尔出现了503错误. 拿到这个问题首先对系统 ...

  6. Nginx 拒绝指定IP访问

    来源 : http://www.ttlsa.com/nginx/nginx-deny-ip-access/   闲来无事,登陆服务器,发现有个IP不断的猜测路径.试图往服务器上传文件(木马).于是查看 ...

  7. SilverlightLoader使用托管代码创建自定义载入界面及动态加载XAP

    Silverlight实现动态加载xap和Splash Screen.收藏! 内容来自 http://silverlightchina.net/html/tips/2010/0115/588.html

  8. 编写一个程序实现strcpy函数的功能

    #include <stdio.h> #include <string.h> #define N 5 char *mycpy(char *s1, char *s2) { //数 ...

  9. Glib程序使用Valgrind查找内存泄露

    G_DEBUG=gc-friendly G_SLICE=always-malloc     //glib有缓存  故需使用 上述两条设置环境变量 G_SLICE和G_DEBUG排除由内存分配机制带来的 ...

  10. 1.9 需求订单导入MDS

    1.9          需求订单导入MDS 1.9.1   业务方案描述 将”需求订单维护表”中完成调整维护的需求订单导入系统标准MDS中,使之驱动对应的物料需求计划(MRP)的运行. 1.9.2  ...