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 ...
随机推荐
- js中函数传参的情况
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 基于JS的文本验证
1,不能为空 <input type="text" onblur="if(this.value.replace(/^ +| +$/g,'')=='')alert(' ...
- chm 文件生成器
1.看云:官网 https://www.kancloud.cn/price 价格如下:
- 【校招面试 之 C/C++】第20题 C++ STL(二)之Vector
1.vector的动态增长 当添加元素时,如果vector空间大小不足,则会以原大小的两倍另外配置一块较大的新空间,然后将原空间内容拷贝过来,在新空间的内容末尾添加元素,并释放原空间.vector的空 ...
- Oracle完全卸载
停用oracle服务:进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止 在开始菜单中,找到Universal Installer,运行Oracle Universal I ...
- AssemblyVersion,AssemblyFileVersion解释以及获取
简而言之,AssemblyVersion: 是程序集的版本,.NET的CLR用,用于标识出该dll的版本信息,用于定义强名称的版本号: AssemblyFileVersion: 为编译器生成的文件加入 ...
- JavaScript开发者的工具箱
自从HTML5变得流行以来,整个Web平台取得了长足的进步,人们也开始将JavaScript视为一门能够创建复杂应用的语言.许多新的API纷纷浮现,而关于浏览器如何应用这些技术的文章也大量涌现. 作为 ...
- PAT 1020 月饼 (25)(精简版代码+思路+推荐测试用例)
1020 月饼 (25)(25 分)提问 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是 ...
- SSH登录到远程linux机器并执行命令
一. 1.JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成 ...
- [NOI.AC]COUNT(数学)
解析: 也可以将所有的可能都计算出来,后进行减法运算. 代码: #include<bits/stdc++.h> using namespace std; #define ll long l ...