一个人的旅行

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 23416    Accepted Submission(s): 8154

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
题解:floy剪枝优化;
代码:
 #include<stdio.h>
#include<string.h>
#define MIN(x,y)(x<y?x:y)
const int INF=0x3f3f3f3f;
const int MAXN=;
int T,S,D,used[MAXN];
int map[MAXN][MAXN],s[MAXN],e[MAXN];
int main(){
int a,b,c;
while(~scanf("%d%d%d",&T,&S,&D)){
memset(used,,sizeof(used));
for(int i=;i<=MAXN;i++)
for(int j=;j<=MAXN;j++)
if(i-j)map[i][j]=INF;
else map[i][j]=;
while(T--){
scanf("%d%d%d",&a,&b,&c);
if(c<map[a][b])map[a][b]=map[b][a]=c;
used[a]++;used[b]++;
}
for(int k=;k<MAXN;k++){
if(!used[k])continue;
for(int i=;i<MAXN;i++){
if(map[i][k]==INF)continue;
for(int j=;j<MAXN;j++){
map[i][j]=MIN(map[i][j],map[i][k]+map[k][j]);
}
}
}
for(int i=;i<S;i++){
scanf("%d",&s[i]);
}
for(int i=;i<D;i++){
scanf("%d",&e[i]);
}
int ans=INF;
for(int i=;i<S;i++)
for(int j=;j<D;j++)
ans=MIN(ans,map[s[i]][e[j]]);
printf("%d\n",ans);
}
return ;
}
dijskra代码:
 #include<stdio.h>
#include<string.h>
#define MIN(x,y)(x<y?x:y)
const int INF=0x3f3f3f3f;
const int MAXN=;
int map[MAXN][MAXN];
int vis[MAXN],d[MAXN];
int N,begin[MAXN],end[MAXN];
void initial(){
//memset(map,INF,sizeof(map));
memset(vis,,sizeof(vis));
memset(d,INF,sizeof(d));
}
void dijskra(int s){
initial();
d[s]=;
int k;
while(true){
k=-;
for(int i=;i<=;i++){
if(!vis[i]&&(k==-||d[i]<d[k]))k=i;
}
if(k==-)break;
vis[k]=;
for(int i=;i<=;i++){
d[i]=MIN(d[i],d[k]+map[k][i]);
}
}
}
int main(){
int T,S,D;
int a,b,c,temp;
while(~scanf("%d%d%d",&T,&S,&D)){
memset(map,INF,sizeof(map));
while(T--){
scanf("%d%d%d",&a,&b,&c);
if(c<map[a][b])map[a][b]=map[b][a]=c;
}
int ans=INF;
for(int i=;i<S;i++)scanf("%d",&begin[i]);
for(int i=;i<D;i++)scanf("%d",&end[i]);
for(int i=;i<S;i++){
dijskra(begin[i]);
for(int j=;j<D;j++){
// printf("%d\n",temp);
ans=MIN(ans,d[end[j]]);
}
}
printf("%d\n",ans);
}
return ;
}

SPFA

 #include<stdio.h>
#include<string.h>
#include<queue>
#define MIN(x,y) (x<y?x:y)
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=;
const int MAXM=;
int head[MAXM];
struct Edge{
int from,to,value,next;
};
Edge edg[MAXM];
int T;
int S;
int D;
int enu;
int s[MAXN],e[MAXN];
int vis[MAXN],dis[MAXN],used[MAXN];
queue<int>dl;
void initial(){
memset(dis,INF,sizeof(dis));
memset(vis,,sizeof(vis));
while(!dl.empty()){
dl.pop();
}
}
void SPFA(int sx){
initial();
vis[sx]=;dis[sx]=;dl.push(sx);
while(!dl.empty()){
int k=dl.front();
dl.pop();
vis[k]=;
for(int i=head[k];i!=-;i=edg[i].next){
int v=edg[i].to;
if(dis[k]+edg[i].value<dis[v]){
dis[v]=dis[k]+edg[i].value;
if(!vis[v])
dl.push(v),vis[v]=;
}
}
}
}
void add(int u,int v,int value){
Edge E={u,v,value,head[u]};
edg[enu]=E;
head[u]=enu++;
}
void get(){
int a,b,c;
while(T--){
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
for(int i=;i<S;i++)scanf("%d",&s[i]);
for(int i=;i<D;i++)scanf("%d",&e[i]);
}
void print(){
int ans=INF;
for(int i=;i<S;i++){
SPFA(s[i]);
for(int j=;j<D;j++){
ans=MIN(ans,dis[e[j]]);
}
}
printf("%d\n",ans);
}
int main(){
while(~scanf("%d%d%d",&T,&S,&D)){
memset(head,-,sizeof(head));
enu=;
get();
print();
}
return ;
}

Bellman+剪枝:14ms水过;

 #include<stdio.h>
#include<string.h>
#define MIN(x,y)(x<y?x:y)
const int INF=0x3f3f3f3f;
const int MAXN=;
const int MAXM=;
int dis[MAXN],s[MAXN],e[MAXN],used[MAXN];
struct Node{
int s,e,dis;
};
Node dt[MAXM];
int T,S,D,top,ans;
void Bellman(){
int u,v,w;
memset(dis,INF,sizeof(dis));
for(int i=;i<S;i++)dis[s[i]]=;
for(int j=;j<MAXN;j++){
if(!used[j])continue;
for(int i=;i<top;i++){
u=dt[i].s;v=dt[i].e;w=dt[i].dis;
dis[v]=MIN(dis[v],dis[u]+w);
}
}ans=INF;
for(int i=;i<D;i++)ans=MIN(dis[e[i]],ans);
printf("%d\n",ans);
}
int main(){
int a,b,c;
while(~scanf("%d%d%d",&T,&S,&D)){
top=;
memset(used,,sizeof(used));
while(T--){
scanf("%d%d%d",&a,&b,&c);
dt[top].s=a;dt[top].e=b;dt[top++].dis=c;
dt[top].s=b;dt[top].e=a;dt[top++].dis=c;
used[a]++;used[b]++;
}
for(int i=;i<S;i++)scanf("%d",&s[i]);
for(int i=;i<D;i++)scanf("%d",&e[i]);
Bellman();
}
return ;
}

一个人的旅行(floyd+dijskra+SPFA+Bellman)的更多相关文章

  1. 最短路(dijskra+SPFA+Bellman)

    最短路 Time Limit : 5000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissio ...

  2. 六度分离(floyd算法+dijskra+SPFA)

    六度分离 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. Wormholes(SPFA+Bellman)

    Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 36860   Accepted: 13505 Descr ...

  4. 最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)

    Dijkstra算法: 解决的问题: 带权重的有向图上单源最短路径问题.且权重都为非负值.如果采用的实现方法合适,Dijkstra运行时间要低于Bellman-Ford算法. 思路: 如果存在一条从i ...

  5. 畅通工程续(dijskra+SPFA)

    畅通工程续 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  6. ZOJ 2770 Burn the Linked Camp(spfa&&bellman)

    //差分约束 >=求最长路径 <=求最短路径 结果都一样//spfa#include<stdio.h> #include<string.h> #include< ...

  7. Dijkstra、Dij + heap、Floyd、SPFA、 SPFA + SLF Template

    Dijkstra in Adjacency matrix : int Dijkstra(int src,int tec, int n){ ]; ]; memset(done,,sizeof(done) ...

  8. Nyoj Arbitrage(Floyd or spfa or Bellman-Ford)

    描述Arbitrage is the use of discrepancies in currency exchange rates to transform one unit of a curren ...

  9. 最短路问题 Floyd+Dijkstra+SPFA

    参考博客:https://blog.csdn.net/qq_35644234/article/details/60875818 题目来源:http://acm.hdu.edu.cn/showprobl ...

随机推荐

  1. 集成支付宝SDK遇到的坑

    一.首先我先把集成过程说一下.小编想说的话:支付宝是我做支付中觉得坑最多的一个,各种编译不过,各种出问题. 废话不多说,进入主题:1.首先当前是下载官方SDK啦,当前你也可以通过cocopods进行导 ...

  2. Duanxx的STM32学习: STM32的存储映射

  3. SQLLoader6(一个或多个数据文件按条件导入不同的表)

    测试一1.创建表: SQL), col2 )); 表已创建. SQL), col2 )); 表已创建. SQL> COMMIT; 提交完成. 2.数据文件:test.txt A A A B B ...

  4. [CSAPP笔记][第一章计算机系统漫游]

    计算机系统漫游 我们通过追踪hello程序的生命周期来开始对系统的学习—–从它被程序员创建,到系统上运行,输出简单的消息,然后终止.我们沿着这个程序的生命周期,简要介绍一些逐步出现的概念,专业术语和组 ...

  5. MongoDB学习笔记05

    count 返回集合中文档数量文档数量 db.foo.count() db.foo.count({}) distinct用来找出给定键的所有不同的值,使用时必须指定集合和键 db.runCommand ...

  6. 软件设计之UML—UML中的六大关系

    http://www.cnblogs.com/hoojo/p/uml_design.html

  7. UIView的动画之初步学习

    animateWithDuration:<#(NSTimeInterval)#> delay:<#(NSTimeInterval)#> options:<#(UIView ...

  8. 安装SQL2008时遇到"未能加载文件或"file:///d:microsoft..sql.chainer.packagedata.dll"或它的某个依赖项

    安装SQL2008时遇到"未能加载文件或"file:///d:microsoft..sql.chainer.packagedata.dll"或它的某个依赖项,如下图所示 ...

  9. yii2 打印sql语句

    echo $temp_chat_query->createCommand()->getRawSql();

  10. JS控制文本框中的密码显示/隐藏功能

    <html> <head> <title>[荐]JS控制文本框中的密码显示/隐藏功能_网页代码站(www.6a8a.com)</title> <s ...