题目

题意:给定一个有向图,多个起点,一个终点,求起点到终点的最短路。

这道题TLE了好多次,两侧次的对比主要在于对起点的处理上,法一:最开始是采用的hdu2066——一个人的旅行,这道题的方法做的,发现总是TLE。

法二:然后看别人的博客:再加上一个点作为起点,编号为0,这个点和题中给的那些起点之间的距离为0。这样题目就转化为了求单源最短路径问题。

当时我觉得这两种做法没有什么不同,结果我错了。法一:每个起点都要去运行一边 Dijkstra算法,而法二:只用运行一次Dijkstra算法,所以法一总是超时。

接下来给出两次的代码:

法一:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int Max = 1010;
const int INF = 0xFFFFFFF;
int value[Max][Max];
int vis[Max];
int dis[Max];
int s[Max];
int T,S,D;
void init(){
for(int i = 1 ; i <= T ; i++){
for(int j = 1 ; j <= T ; j++)
value[i][j] = INF;//初始化点与点之间的距离
}
}
void Dijkstra(int s)
{
int pos;//?
int i,j;
memset(vis,0,sizeof(vis));
for( i=1;i<=T;i++)
dis[i]=INF;
dis[s]=0;
for( i = 1;i<=T;i++)
{
pos = -1;
for( j=1;j<=T;j++)
{
if(!vis[j]&&(pos==-1||dis[j]<dis[pos]))
pos=j;//?
}
if(pos == -1)
break;
vis[pos]=1;
for( j=1;j<=T;j++)
{
if(!vis[j]&&dis[j]>dis[pos]+value[pos][j])
dis[j]=dis[pos]+value[pos][j];
}
}
}
int main()
{ int a,b,v,ans,i; while(~scanf("%d%d%d",&T,&S,&D))
{
init(); memset(s,0,sizeof(s));
// for(int i=1;i<=T;i++)
// v[i]=i;
for( i=0; i<S; i++)
{
scanf("%d%d%d",&a,&b,&v);
if(value[a][b] > v) //要是有相同边,保存最短的边
value[a][b]=v;
}
int w;
scanf("%d",&w);
for( i=0;i<w;i++)
scanf("%d",&s[i]); //枚举
ans = INF;
for( i=0;i<w;i++)
{
Dijkstra(s[i]); ans = ans<dis[D]? ans : dis[D];
}
if(ans!=INF)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}

法二:

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int Max = 1010;
const int INF = 0xFFFFFFF;
int value[Max][Max];
int vis[Max];
int dis[Max];
int T,S,D;
void init(){
for(int i = 0 ; i <= T ; i++){
for(int j = 0 ; j <= T ; j++)
value[i][j] = INF;//初始化点与点之间的距离
}
}
void Dijkstra(int s)
{
int pos;//?
int i,j;
memset(vis,0,sizeof(vis));
for( i=0;i<=T;i++)
dis[i]=INF;
dis[s]=0;
for( i = 0;i<=T;i++)
{
pos = -1;
for( j=0;j<=T;j++)
{
if(!vis[j]&&(pos==-1||dis[j]<dis[pos]))
pos=j;//?
}
if(pos == -1)
break;
vis[pos]=1;
for( j=0;j<=T;j++)
{
if(!vis[j]&&dis[j]>dis[pos]+value[pos][j])
dis[j]=dis[pos]+value[pos][j];
}
}
}
int main()
{ int a,b,v,i;
int s;
while(~scanf("%d%d%d",&T,&S,&D))
{
init();
for( i=0; i<S; i++)
{
scanf("%d%d%d",&a,&b,&v);
if(value[a][b] > v) //要是有相同边保存最短的边
value[a][b]=v;
}
int w;
scanf("%d",&w);
for(i=0;i<w;i++)
{
scanf("%d",&s);
value[0][s]=0;
}
Dijkstra(0);
if(dis[D]!=INF)
printf("%d\n",dis[D]);
else
printf("-1\n");
}
return 0;
}

hdu2680 choose the best route的更多相关文章

  1. 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 ...

  2. 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 ...

  3. hdu-2680 Choose the best route(最短路)

    题目链接: Choose the best route Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K ( ...

  4. HDU-2680 Choose the best route 单向边+反向dijkstra

    https://vjudge.net/problem/HDU-2680 题意:以起始点 终点 长度 给出一个图,已知可以从w个起点出发,求从任一起点到同一个终点s的最短路径.注意是单向边.m<1 ...

  5. hdu2680 Choose the best route 最短路(多源转单源)

    此题中起点有1000个,边有20000条.用链式前向星建图,再枚举起点用SPFA的话,超时了.(按理说,两千万的复杂度应该没超吧.不过一般说计算机计算速度 1~10 千万次/秒.也许拿最烂的计算机来卡 ...

  6. hdu 2680 Choose the best route

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Description One day , Kiki ...

  7. Choose the best route(最短路)dijk

    http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Time Limit: 2000/1000 MS (Java/ ...

  8. 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 ( ...

  9. 最短路问题-- Dijkstra Choose the best route

    Choose the best route Problem Description One day , Kiki wants to visit one of her friends. As she i ...

随机推荐

  1. django中怎么使用mysql数据库的事务

    Mysql数据库事务: 在进行后端业务开始操作修改数据库时,可能会涉及到多张表的数据修改,对这些数据的修改应该是一个整体事务,即要么一起成功,要么一起失败. Django中对于数据库的事务,默认每执行 ...

  2. 查看webdriver针对浏览器的一些函数

    在用webdriver对浏览器进行操作时,很多操作并不是那么好找,后来在朋友的推荐下可以用下面的方法来寻找针对浏览器的一些操作,函数或属性等,这样方便我们可以查找一些方法去完成我们要的操作. 下面是查 ...

  3. 可以foreach的 必须继承IEnumable 接口才行

    只要是继承IEnumable 都可以用foreach遍历

  4. luoguP3367 [模板]并查集

    题目链接:https://www.luogu.org/problemnew/show/P3367 思路: 今天学了新算法——并查集,本题是简单的并查集题的模板. 核心思想是“递归+压缩路径”. 并查集 ...

  5. Pocket Cube

    Pocket Cube http://acm.hdu.edu.cn/showproblem.php?pid=5983 Time Limit: 2000/1000 MS (Java/Others)    ...

  6. Phalcon Framework的MVC结构及启动流程分析

    目前的项目中选择了Phalcon Framework作为未来一段时间的核心框架.技术选型的原因会单开一篇Blog另说,本次优先对Phalcon的MVC架构与启动流程进行分析说明,如有遗漏还望指出. P ...

  7. doctotext

    文档解析库 http://www.it610.com/article/1936051.htm

  8. Debian Buster 配置 Laravel 运行环境(nginx + redis + supervisor)

    1 目标 将开发完成的 Laravel 项目布署于 Debian 之上.由于项目要求使用 horizon 官方扩展,要求 PHP7.1+,故采用 Debian buster (下一版) 2 材料 IP ...

  9. Zookeeper 系列(四)ZKClient API

    Zookeeper 系列(四)ZKClient API 环境准备: <dependency> <groupId>com.101tec</groupId> <a ...

  10. 2018.07.08 POJ 2481 Cows(线段树)

    Cows Time Limit: 3000MS Memory Limit: 65536K Description Farmer John's cows have discovered that the ...