hdu2680 choose the best route
题意:给定一个有向图,多个起点,一个终点,求起点到终点的最短路。
这道题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的更多相关文章
- 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 ...
- 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(最短路)
题目链接: Choose the best route Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ( ...
- HDU-2680 Choose the best route 单向边+反向dijkstra
https://vjudge.net/problem/HDU-2680 题意:以起始点 终点 长度 给出一个图,已知可以从w个起点出发,求从任一起点到同一个终点s的最短路径.注意是单向边.m<1 ...
- 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 ...
- Choose the best route(最短路)dijk
http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Time Limit: 2000/1000 MS (Java/ ...
- 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 ...
随机推荐
- 判断是否有TrueType字体
function IsTrueTypeAvailable : bool;var {$IFDEF WIN32} rs : TRasterizerStatus; {$ELSE} rs : TRaste ...
- 疯狂JAVA——第八章 java集合
集合类主要负责保存.盛装其他数据,因此集合类也被称为容器类. 数组元素既可以是基本类型的值,也可以是对象(实际上是保存的对象的引用): 集合里只能保存对象.
- jsp 不显示换行 Eclipse复制一行快捷键
jsp通过out.println();不能换行.html中需要标签<br/>才可以 Eclipse 复制整行代码移动:Ctrl+Alt+↑/↓.但是跟系统屏幕上下切换冲突,可以选择,在电脑 ...
- ContextLoaderListener和Spring MVC中的DispatcherServlet学习
DispatcherServlet介绍 DispatcherServlet是Spring前端控制器的实现,提供Spring Web MVC的集中访问点,并且负责职责的分派,与Spring IoC容器无 ...
- thymeleaf从session中获取数据
<input th:value="${session.value1}" />
- 批量删除进程清理 minerd
发现顽固minerd 进程与ntp一起启动,所以一起杀掉 yum remove ntp kill -9 `ps -ef | grep ntp|awk '{print $2}'` kill -9 `ps ...
- Spring工作原理与单例
最近看到spring管理的bean为单例的,当它与web容器整合的时候始终搞不太清除,就网上搜索写资料, Tomcat与多线程, servlet是多线程执行的,多线程是容器提供的能力. servlet ...
- 几个小模板:topology, dijkstra, spfa, floyd, kruskal, prim
1.topology: #include <fstream> #include <iostream> #include <algorithm> #include & ...
- Unity3d dll 热更新 基础框架
APK包装到用户手机上后,代码如何更新,总不能全用LUA吧?特别是代码非常多的战斗手游 昨晚上有了dll 热更新的想法,今天做了一天的实验,也遇到些坑,这里总结下 工作环境: U3D5.3.2 + v ...
- 配置Spring框架编写XML的提示
1. 步骤一:先复制, http://www.springframework.org/schema/beans/spring-beans.xsd 2. 步骤二:搜索XML Catalog,点击Add按 ...