hdu 2066 一个人的旅行_最短路
2014-05-07 23:01
453 查看
题目链接
题意:虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
思路:套最短路模板
Timeout代码 开始想设n个初始点,m个终点,做n*m次dij,求最少,结果必然超时.
把0设为初始点,n设为终点,只需做一次dji就行了! Time:31MS
用邻接表+spfa 优化到 Time:0MS
题意:虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
思路:套最短路模板
Timeout代码 开始想设n个初始点,m个终点,做n*m次dij,求最少,结果必然超时.
#include <iostream> #include<cstdio> using namespace std; const int INF=0xfffffff; #define MAXN 1010 int begin,end,n,m; int edge[MAXN][MAXN]; int dijkstra(){ int dist[MAXN],mark[MAXN]; int i,j,tmp,Min; for(i=1;i<=n;i++){ dist[i]=edge[begin][i]; mark[i]=1; } mark[begin]=-1; for(i=1;i<=n;i++){ tmp=-1; Min=INF; for(j=1;j<=n;j++){ if(mark[j]!=-1&&dist[j]<Min){ tmp=j; Min=dist[j]; } } if(tmp!=-1){ mark[tmp]=-1; for(j=1;j<=n;j++){ if(mark[j]!=-1&&dist[j]>edge[tmp][j]+dist[tmp]){ dist[j]=edge[tmp][j]+dist[tmp]; } } } } if(dist[end]==INF) return INF; return dist[end]; } int main(int argc, char** argv) { int u,v,e,i,j,k,s,be[MAXN],ed[MAXN],ans; while(scanf("%d%d%d",&m,&s,&k)!=EOF){ n=1; for(i=0;i<=1000;i++) for(j=0;j<=1000;j++) if(i!=j) edge[i][j]=INF; for(i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&e); if(edge[u][v]>e) edge[u][v]=edge[v][u]=e; if(u>n) n=u; if(v>n) n=v; } ans=INF; for(i=0;i<s;i++) scanf("%d",&be[i]); for(i=0;i<k;i++) scanf("%d",&ed[i]); for(i=0;i<s;i++) for(j=0;j<k;j++){ begin=be[i]; end=ed[j]; u=dijkstra(); if(ans>u){ ans=u; } } printf("%d\n",ans); } return 0; }
把0设为初始点,n设为终点,只需做一次dji就行了! Time:31MS
#include <iostream> #include<cstdio> using namespace std; const int INF=0xfffffff; #define MAXN 1010 int begin,end,n,m; int edge[MAXN][MAXN]; int dijkstra(){ int dist[MAXN],mark[MAXN]; int i,j,tmp,Min; for(i=1;i<=n;i++){ dist[i]=edge[0][i]; mark[i]=1; } mark[0]=-1; for(i=1;i<=n;i++){ tmp=-1; Min=INF; for(j=1;j<=n;j++){ if(mark[j]!=-1&&dist[j]<Min){ tmp=j; Min=dist[j]; } } if(tmp!=-1){ mark[tmp]=-1; for(j=1;j<=n;j++){ if(mark[j]!=-1&&dist[j]>edge[tmp][j]+dist[tmp]){ dist[j]=edge[tmp][j]+dist[tmp]; } } } } return dist ; } int main(int argc, char** argv) { int u,v,e,i,j,k,s,ans; while(scanf("%d%d%d",&m,&s,&k)!=EOF){ n=0; for(i=0;i<=1000;i++) for(j=0;j<=1000;j++) edge[i][j]=INF; for(i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&e); if(edge[u][v]>e) edge[u][v]=edge[v][u]=e; if(u>n) n=u; if(v>n) n=v; } n++; for(i=0;i<s;i++){ scanf("%d",&u); edge[0][u]=edge[u][0]=0; } for(i=0;i<k;i++){ scanf("%d",&u); edge[u] =edge [u]=0; } ans=dijkstra(); printf("%d\n",ans); } return 0; }
用邻接表+spfa 优化到 Time:0MS
#include <iostream> #include<cstdio> #include<queue> using namespace std; const int INF=0xfffffff; #define MAXN 1010 int begin,end,n,m,num; int head[MAXN]; struct Edge { int f,t,v,next; }edge[2005]; void add(int a,int b,int c) { edge[num].f=a , edge[num].t=b , edge[num].v=c , edge[num].next=head[a] , head[a]=num++; edge[num].f=b , edge[num].t=a , edge[num].v=c , edge[num].next=head[b] , head[b]=num++; } int spfa(){ queue<int>q; int dist[MAXN],i; bool vis[MAXN]; for(i=0;i<=n;i++){ dist[i]=INF; vis[i]=false; } q.push(begin); dist[begin]=0; while(!q.empty()){ int p=q.front(); q.pop(); vis[p]=false; for(i=head[p];i!=-1;i=edge[i].next){ if(dist[edge[i].t]>dist[p]+edge[i].v){ dist[edge[i].t]=dist[p]+edge[i].v; if(vis[edge[i].t]==false) q.push(edge[i].t); } } } return dist[end]; } int main(int argc, char** argv) { int u,v,e,i,j,k,s,ans; while(scanf("%d%d%d",&m,&s,&k)!=EOF){ n=0; num=0; for(i=0;i<MAXN;i++) head[i]=-1; for(i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&e); add(u,v,e); if(u>n) n=u; if(v>n) n=v; } n++; for(i=0;i<s;i++){ scanf("%d",&u); add(u,0,0); } for(i=0;i<k;i++){ scanf("%d",&u); add(u,n,0); } begin=0; end=n; ans=spfa(); printf("%d\n",ans); } return 0; }
相关文章推荐
- HDU-2066 一个人的旅行(最短路[Floyd])
- HDU 2066 一个人的旅行(最短路&Dijkstra)
- hdu 2066 一个人的旅行(单源最短路dijkstra)and hdu 2544
- hdu 2066 一个人的旅行 最短路 dijkstra 解题报告
- HDU--杭电--2066--一个人的旅行--最短路
- HDU 2066 一个人的旅行(最短路的简单题)
- hdu 2066 一个人的旅行 最短路spfa
- HDU 2066 一个人的旅行(单源最短路SPFA)
- HDU 2066 一个人的旅行(最短路)
- 【hdu 2066】 一个人的旅行 ( 最短路 Dijkstra)
- hdu 2066 一个人的旅行 (多源最短路 )
- HDU 2066 一个人的旅行 (最短路----floyd && dijkstra)
- HDU 2066 一个人的旅行【最短路,多起点多终点,Dijkstra算法+spfa算法】
- HDU 2066 一个人的旅行 (单源最短路)
- HDU 2066 一个人的旅行(最短路)
- HDU-2066 一个人的旅行(图论,Floyd ,最短路)
- hdu-2066 一个人的旅行(最短路spfa)
- HDU - 2066 一个人的旅行(dijkstra最短路)
- HDU 2066 一个人的旅行【最短路,多起点多终点,Dijkstra算法+spfa算法】
- hdu 2066 一个人的旅行 (多源最短路 Floyd)