一个人的旅行

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. springmvc工作原理和环境搭建

    SpringMVC工作原理     上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServle ...

  2. PC--CSS技巧

    1.图片不存在的时候,显示一个默认图片 <img src=”01.jpg” onerror=”this.src=’02.jpg'” /> 2.CSS强制图片自适应大小 img {width ...

  3. Max Sum of Max-K-sub-sequence(单调队列)

    Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  4. Android软件开发之常用系统控件界面整理

    1.文本框TextView TextView的作用是用来显示一个文本框,下面我用两种方式为大家呈现TextView, 第一种是通过xml布局文件呈现 ,第二种是通过代码来呈现,由此可见Android ...

  5. vc10的C2664和C2065错误

    在vs2010中编译一个普通的C++程序(Win32 Console Application),都会出现这两个错误! 究其原因是:我们已经习惯了VC6的种种简陋和不规范! 例如,下列程序在VC6中编译 ...

  6. [Javascript] property function && Enumeration

    var vehicle3 = { type: "Submarine", capacity: 8, storedAt: "Underwater Outpost", ...

  7. 推荐几个常用的jquery ui 框架

    jQuery ui框架很多,除了官方提供的jquery UI(如果你还不知道什么是jQuery UI,请看下载了jquery ui后如何使用),还有很多第三方提供的ui框架,因官方提供的jquery ...

  8. 关于.net 对.manifest清单文件查找缓存的猜想

    问题背景: winform调用unity web player 插件. 按如下操作: ,编译后会生成.manifest清单文件: 通过清单内容可以看出程序在运行时是按照以上信息来查找ActiveX控件 ...

  9. MySQL的字符串函数截取字符

    函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...

  10. 使用HttpClient发送GET请求

    HttpRequestMessage http_req_msg = new HttpRequestMessage(); http_req_msg.Method = HttpMethod.Get; ht ...