hdu 2066 一个人的旅行_最短路
来源:互联网 发布:软件加人规则 编辑:程序博客网 时间:2024/06/05 20:15
题目链接
题意:虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。
思路:套最短路模板
Timeout代码 开始想设n个初始点,m个终点,做n*m次dij,求最少,结果必然超时.
#include <iostream>#include<cstdio>using namespace std;const int INF=0xfffffff;#define MAXN 1010int 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 1010int 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[n];}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][n]=edge[n][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 1010int 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;}
0 0
- hdu 2066 一个人的旅行_最短路
- HDU-2066 一个人的旅行 最短路
- hdu 2066 一个人的旅行(最短路)
- hdu 2066 一个人的旅行(最短路)
- hdu 2066 一个人的旅行(最短路)
- HDU - 2066- 一个人的旅行【最短路】
- HDU 2066 一个人的旅行(最短路的简单题)
- 【hdu 2066】 一个人的旅行 ( 最短路 Dijkstra)
- hdu 2066 一个人的旅行(Dijkstra求最短路问题)
- hdu 2066 一个人的旅行(最短路问题)
- HDU 2066 一个人的旅行(最短路&Dijkstra)
- HDU 2066 一个人的旅行 最短路问题
- HDU--杭电--2066--一个人的旅行--最短路
- HDU 2066 一个人的旅行(最短路)
- HDU 2066一个人的旅行(dijk最短路)
- HDU-2066 一个人的旅行(图论,Floyd ,最短路)
- HDU 2066-一个人的旅行(最短路Dijkstra)
- hdu 2066 一个人的旅行(Dijkstra求最短路)
- SDUTOJ 2848 Fence Repair
- Pat(Advanced Level)Practice--1060(Are They Equal)
- 空间滤波(二)
- reds 2 之 hiredis
- 定积分解法
- hdu 2066 一个人的旅行_最短路
- 微软面试100题之第4题
- event.preventDefault() 取消事件的默认行为
- uva 11967 - Hic-Hac-Hoe
- 工科男崎岖的求职之路--计算机、银行、公务员
- ubuntu 14.04为/检查磁盘时发生严重错误的解决方法
- ubuntu下安装firefox的flash插件
- JNDI 是什么
- Java的内存泄露