一个人的旅行 2066 (Dijkstra)
2015-08-17 13:35
405 查看
一个人的旅行
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 24450 Accepted Submission(s): 8489
[align=left]Problem Description[/align]
虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
[align=left]Input[/align]
输入数据有多组,每组的第一行是三个整数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个数,表示草儿想去地方。
[align=left]Output[/align]
输出草儿能去某个喜欢的城市的最短时间。
[align=left]Sample Input[/align]
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
[align=left]Sample Output[/align]
9
//Dijkstra算法的简单模板, //难点::因为题中没有给出城市的数目,所以这块纠结了很长时间,最后 // 用1000试了一下,想着回超时,但一提交竟然过了。 #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #define mx 0x3f3f3f3f using namespace std; int map[1010][1010],dis[1010],vis[1010]; int s[1010],d[1010]; int T,S,D; void djs(int x) { int i,j,k; memset(vis,0,sizeof(vis)); for(i=1;i<=1000;i++) dis[i]=mx; dis[x]=0; for(j=1;j<1000;j++) { k=-1; for(i=1;i<=1000;i++) { if(!vis[i]&&(k==-1||dis[i]<dis[k])) k=i; } if(k==-1) break; vis[k]=1; for(i=1;i<=1000;i++) dis[i]=min(dis[i],dis[k]+map[k][i]); } } int main(){ int mi; while(scanf("%d%d%d",&T,&S,&D)!=EOF) { int a,b,c,i,j; memset(map,mx,sizeof(map)); while(T--) { scanf("%d%d%d",&a,&b,&c); if(map[a][b]>c) { map[a][b]=map[b][a]=c; } } mi=mx; for(i=0;i<S;i++) scanf("%d",&s[i]); for(i=0;i<D;i++) scanf("%d",&d[i]); for(i=0;i<S;i++) { djs(s[i]); for(j=0;j<D;j++) { if(dis[d[j]]<mi)//找最小值 mi=dis[d[j]]; } } printf("%d\n",mi); } return 0; }//SPFA算法解
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f using namespace std; int dis[1100],vis[1100]; struct Edge { int from,to,val,next; }edge[2100]; int head[2100]; int edgenum; int T,S,D; void add(int u,int v,int w) { Edge E={u,v,w,head[u]}; edge[edgenum]=E; head[u]=edgenum++; } void SPFA(int x) { queue<int>q; memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); q.push(x); dis[x]=0; vis[x]=1; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(dis[v]>dis[u]+edge[i].val) { dis[v]=dis[u]+edge[i].val; if(!vis[v]) { vis[v]=1; q.push(v); } } } } } int s[1010],d[1010]; int main() { while(scanf("%d%d%d",&T,&S,&D)!=EOF) { int a,b,c,i,j; int mm; memset(head,-1,sizeof(head)); edgenum=0; while(T--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } for(i=0;i<S;i++) scanf("%d",&s[i]); for(i=0;i<D;i++) scanf("%d",&d[i]); mm=INF; for(i=0;i<S;i++) { SPFA(s[i]); for(j=0;j<D;j++) { mm=min(mm,dis[d[j]]); } } printf("%d\n",mm); } return 0; }
//floyd解 <pre class="cpp" name="code">#include<stdio.h> #include<string.h> #define MIN(x,y)(x<y?x:y) #define INF 0x3f3f3f3f #define MAXN 1010 int T,S,D,used[MAXN]; int map[MAXN][MAXN],s[MAXN],e[MAXN]; void floyd() { for(int k=0;k<MAXN;k++) { if(!used[k]) continue; for(int i=0;i<MAXN;i++) { if(map[i][k]==INF) continue; for(int j=0;j<MAXN;j++) { map[i][j]=MIN(map[i][j],map[i][k]+map[k][j]); } } } } int main(){ int a,b,c; while(~scanf("%d%d%d",&T,&S,&D)) { memset(used,0,sizeof(used)); for(int i=0;i<=MAXN;i++) for(int j=0;j<=MAXN;j++) if(i==j) map[i][j]=0; else map[i][j]=INF; 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]++; } floyd(); for(int i=0;i<S;i++) scanf("%d",&s[i]); for(int i=0;i<D;i++) scanf("%d",&e[i]); int ans=INF; for(int i=0;i<S;i++) for(int j=0;j<D;j++) ans=MIN(ans,map[s[i]][e[j]]); printf("%d\n",ans); } return 0; }
相关文章推荐
- synchronized与Lock有什么异同
- STM32F103移植uCOSIII始终卡在PendSV或Systick处解决办法
- Linux进程的实际用户ID和有效用户ID
- DOS日期和时间 - Robin Hu的专栏 - 博客频道 - CSDN.NET
- package html to native application
- UI设计师不可不知的安卓屏幕知识
- 再读《C和指针》(笔记2)
- TFS权限设置学习笔记(1)
- centos7.0安装配置DRBD
- ExtJs 复杂的panel设置控件只读
- abstract class 和 interface 区别
- 【Shader】Shader名词详解
- 五种进程调度的算法实现(三)
- IOS创建目录接口createDirectoryAtPath:withIntermediateDirectories:中参数attributes的设置
- 关于STRUCT命名的问题
- PeekMessage完美解决MFC主界面无响应
- java登录程序用户密码5分钟内输错3次锁定用户账号一天的实现
- 适配器模式
- 1080. Graduate Admission (30)
- pat(A) 1002. A+B for Polynomials (一元多项式的表示及相加)