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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为畅享8声音小怎么办 华为5a安全模式怎么办 手机跳屏怎么办金立 苹果手机触控不灵敏怎么办 华为mate8手机声音小怎么办 华为mate9相机无法对焦怎么办 新疆外地电信卡信号差怎么办 华为手机搜索不到wifi怎么办 华为浏览器恢复只有一个页面怎么办 华为手机触摸屏没反应怎么办 快递不给送上楼怎么办 华为荣耀手机声音小怎么办 华为手机来电铃声小怎么办 s弯出来时老压线怎么办 苹果7p手机弯了怎么办 小米手机摔弯了怎么办 华为畅享5没声音怎么办 掌阅语音闪退怎么办 华为mate开屏成排线怎么办 华为mate8电池坏了怎么办 8plus拍照不清晰怎么办 荣耀手环3丢了怎么办 华为mate9手机声音小怎么办 华为麦芒6丢了怎么办 华为麦芒4无法访问移动网络怎么办 自拍时屏幕是白的怎么办 华为麦芒5手机音量小怎么办 小米5x玩王者卡怎么办 小米5x打王者卡怎么办 华为荣耀10卡顿怎么办 麦芒6记不得密码怎么办 华为麦芒4镜头碎了怎么办 三星s5出像网的信号怎么办 华为手机进海水资料怎么办 华为手机进海水了怎么办 苹果手机玩王者荣耀卡怎么办 玩王者荣耀闪屏怎么办 王者荣耀太卡了怎么办 想卖王者号qq怎么办 小米4电视发热严重怎么办 三星玩王者荣耀卡怎么办