一个人的旅行

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 23396    Accepted Submission(s): 8142

Problem 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
 解题思路
        这是一道求最短路径的问题,跟普通的最短路径不同的是这个题有多个起点,能够用for循环迪杰斯特拉来解答。
        也许会操心第一次迪杰斯特拉之后,那map数组的值不是已经发生变化了吗?第二次会受影响吗?
        答案是否定的,我们只须要初始now和ok数组就好,map数组不过存储距离,假设第一次之后map[i][j]的值为2,
        而第二次map[i][j]的值为3,非常显然我们会选择2,3直接排除掉了。
        for循环迪杰斯特拉之后的map数组是到全部地点的最短距离。不论从哪个原地出发。
错误原因
       OJ显示Runtime Error(ACCESS_VIOLATION)。造成这个错误的原因有两个,(1)数组开小了,(2)数组被越界了
代码
#include<stdio.h>
int map[1100][1100];
int ok[1100];
int now[1100];
int sta[1100];
int end[1100];
#define max 1007
int main()
{
int t,s,d;
int i,j,k;
int nowlen,nowx;
int a,b,l;
int ans;
while(scanf("%d%d%d",&t,&s,&d)!=EOF)
{
for(i=1;i<=max;i++)
for(j=1;j<=max;j++)
map[i][j]=max;//map初始为无穷大
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&a,&b,&l);
if(map[a][b]>l)
map[a][b]=map[b][a]=l;
}//更新给定的距离
for(i=1;i<=s;i++)
scanf("%d",&sta[i]);
for(i=1;i<=d;i++)
scanf("%d",&end[i]);
for(i=1;i<=s;i++)
{//for循环迪杰斯特拉
for(j=1;j<=max;j++)
{
now[j]=max;
ok[j]=0;
}
now[sta[i]]=0;
ok[sta[i]]=1;//初始now和ok
for(k=1;k<=max;k++)
{
nowlen=max;
for(j=1;j<=max;j++)
{
if(!ok[j]&&nowlen>map[sta[i]][j])
{
nowlen=map[sta[i]][j];
nowx=j;
}
}//找到还没确定的距离之中最小的距离
now[nowx]=nowlen;
ok[nowx]=1;
for(j=1;j<=max;j++)
{
if(!ok[j]&&map[sta[i]][j]>now[nowx]+map[nowx][j])
map[sta[i]][j]=now[nowx]+map[nowx][j];
}//更新其它点到原点的距离
}
}
ans=max;
for(i=1;i<=s;i++)
for(j=1;j<=d;j++)
if(map[sta[i]][end[j]]<ans)
ans=map[sta[i]][end[j]];//找到最小的
printf("%d\n",ans);
}
return 0;
}

hdoj-2066-一个人的旅行(迪杰斯特拉)的更多相关文章

  1. hdoj 2066 一个人的旅行 【多源多汇最短路】

    题目:hdoj 2066 一个人的旅行 方法:缩点 + 最短路 分析:看了大神的一篇博客,讲冗余压缩的,然后就想找一个多源最短路练练手. 这个题目就是典型的多源多汇最短路 方法:把全部的源点压缩成一个 ...

  2. 最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)

    Dijkstra算法 ———————————最后更新时间:2011.9.25———————————Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径. ...

  3. HDU 3339 In Action(迪杰斯特拉+01背包)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=3339 In Action Time Limit: 2000/1000 MS (Java/Others) ...

  4. hdu 3339 In Action(迪杰斯特拉+01背包)

    In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. C#迪杰斯特拉算法

    C#迪杰斯特拉算法 网上有许多版本的,自己还是写一个理解点 Dijkstra.cs public class Dijkstra { private List<Node> _nodes; p ...

  6. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  7. 【算法杂谈】LJX的迪杰斯特拉算法报告

    迪杰斯特拉(di jie qi)算法 这里有一张图: 假设要求从1号节点到5号节点的最短路.那么根据迪杰斯特拉算法的思想,我们先看: 节点1,从节点1出发的一共有3条路,分别是1-6.1-3.1-2. ...

  8. C# 迪杰斯特拉算法 Dijkstra

    什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...

  9. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

随机推荐

  1. o(1), o(n), o(logn), o(nlogn)算法复杂度

    在描述算法复杂度时,经常用到o(1), o(n), o(logn), o(nlogn)来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义: 这是算法的时空复杂度的表示.不仅仅用于表示时间复杂 ...

  2. Python-Analysis-Malware

    Python恶意软件分析应用-PEfile 0x1.前言 要想对恶意代码快速分析,Python是一门必须要掌握的编程技能.因为它是跨平台的,而且容易阅读和编写.许多开源安全工具也是用Python写的. ...

  3. 【CTF WEB】函数绕过

    函数绕过 <?php show_source(__FILE__); $c = "<?php exit;?>"; @$c.=$_GET['c']; @$filena ...

  4. 『记录』Android参考资料

    欢迎留言推荐好的教程.资料.博客及作者等. 『记录』Android参考资料 1.前期环境 Android Studio使用Git Android Studio快捷键总结 Android Studio及 ...

  5. Java基础84 javaBean规范

    1.javaBean的概述 1.javaBeam(咖啡豆)是一种开发规范,也可以说是一种技术.  2.JavaBean就是一个普通java类,只要符合以下规定才能称作为javaBean:        ...

  6. JS的异步模式

    JS的异步模式:1.回调函数:2.事件监听:3.观察者模式:4.promise对象 JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous) ...

  7. Python实现截图

    本文主要介绍了Python实现截图的两种方式,使用PIL的方法和不使用PIL的方法.文中也涉及到了一些位图的知识.

  8. Pandas常用命令

    一.数据导入和导出 (一)读取csv文件 1.本地读取 import pandas as pd df = pd.read_csv('tips.csv') #根据自己数据文件保存的路径填写(p.s. p ...

  9. 系统管理员常用的Linux命令

    整理Linux的一些基本系统管理命令作为备忘 ========================================================================= 查看文 ...

  10. 查询物理表字段(mysql)

    SELECT t.COLUMN_NAME AS NAME, ( CASE WHEN t.IS_NULLABLE = 'YES' THEN '1' ELSE '0' END ) AS ISNULL, ( ...