hdu 2066 一个人的旅行(单源最短路dijkstra)and hdu 2544
2014-03-26 08:24
435 查看
题意是给几个城市间车程的时间,给几个和女主家【相邻】的城市(这个条件灰常重要啊!),然后给几个女主【想去】的城市,求女主从她家【相邻】城市到【想去】城市的最短时间。
刚开始做以为是多源的最短路,因为给了好多个【相邻】的城市。
因为忽略了女主家也可以作为起点,这样思路一改变,马上就把多源变为了单源。
具体的实现就是把map[女主家][相邻城市]=0,最后用dijkstra求女主【家】到【想去】城市的最短距离就k.o了。
代码:
对于2066,2544就显得简单得多了。
就是单纯的求1到N的最短路。
代码:
刚开始做以为是多源的最短路,因为给了好多个【相邻】的城市。
因为忽略了女主家也可以作为起点,这样思路一改变,马上就把多源变为了单源。
具体的实现就是把map[女主家][相邻城市]=0,最后用dijkstra求女主【家】到【想去】城市的最短距离就k.o了。
代码:
#include<stdio.h> const int INF=1 << 29; const int MaxN=1001; int T, map[MaxN][MaxN]; bool vis[MaxN]; int len; void dijkstra() { for(int i=0; i<=len; i++) vis[i]=0; for(int i=1; i<=len; i++) { int timemin=INF,mark=-1; for(int j=1; j<=len; j++) { if(!vis[j] && map[0][j]<timemin) { timemin=map[0][j]; mark=j; } } if(timemin==INF) break; vis[mark]=1; for(int j=1; j<=len; j++) { if(!vis[j] && map[0][j]>map[0][mark]+map[mark][j]) map[0][j]=map[0][mark]+map[mark][j]; } } } int main() { #ifndef ONLINE_JUDGE freopen("2066.txt","r",stdin); #endif int S, D; int i, j; int s, e, tmp; int x; int ans; while(scanf("%d%d%d", &T, &S, &D)!=EOF) { for(i=0; i<MaxN; i++) for(j=0; j<MaxN; j++) map[i][j]=INF; len=0;//用于缩短程序运行时间。 for(i=0; i<T; i++) { scanf("%d%d%d",&s,&e,&tmp); if(tmp<map[s][e]) { map[s][e]=tmp; map[e][s]=tmp; } if(len<s) len=s; if(len<e) len=e; } for(i=0; i<S; i++)//将看似多源的转换为单源点。设家乡为0,则如到起点1处,则赋0到1的时间为0。 { scanf("%d",&x); map[0][x]=0; } dijkstra(); ans=INF; for(i=0; i<D; i++) { scanf("%d",&x); if(ans>map[0][x]) ans=map[0][x]; } printf("%d\n",ans); } return 0; }
对于2066,2544就显得简单得多了。
就是单纯的求1到N的最短路。
代码:
#include<stdio.h> const int INF=1 << 29; const int MaxN=101; int N, M; int mp[MaxN][MaxN]; int time[MaxN]; bool vis[MaxN]; void dijkstra() { for(int i=1; i<=N; i++) { vis[i]=0; time[i]=INF; } time[1]=0; for(int i=1; i<=N; i++) { int mark=-1, mintime=INF; for(int j=1; j<=N; j++) { if(!vis[j] && mintime > time[j]) mintime=time[ mark=j ]; } vis[mark]=1; if(mintime==INF) break; for(int j=1; j<=N; j++) if(time[j] > time[mark]+mp[mark][j]) time[j] = time[mark]+mp[mark][j]; } } int main() { int s, e, tmptime; while(scanf("%d%d",&N,&M)!=EOF) { if(N==0&&M==0) break; for(int i=0; i<MaxN; i++) for(int j=0; j<MaxN; j++) { if(i==j) mp[i][j]==0; else mp[i][j]=INF; } for(int i=0; i<M; i++) { scanf("%d%d%d", &s, &e, &tmptime); if(tmptime < mp[s][e]) mp[s][e]=mp[e][s]=tmptime; } dijkstra(); printf("%d\n",time ); } return 0; }
相关文章推荐
- 【hdu 2066】 一个人的旅行 ( 最短路 Dijkstra)
- HDU - 2066 一个人的旅行(dijkstra最短路)
- HDU 2066-一个人的旅行(最短路Dijkstra)
- HDU 2066 一个人的旅行(Dijkstra求特殊点的单源最短路径)
- HDU 2066-一个人的旅行(最短路Dijkstra)
- hdu 2066 一个人的旅行 最短路 dijkstra 解题报告
- HDU 2066 一个人的旅行 (单源最短路)
- hdu 2066 一个人的旅行(Dijkstra求最短路)
- HDU 2066 一个人的旅行(最短路&Dijkstra)
- 【HDU - 2066 一个人的旅行】 最短路 dijkstra,spfa
- HDU 2066 一个人的旅行(单源最短路SPFA)
- HDU 2066 一个人的旅行 (最短路----floyd && dijkstra)
- HDU 2066 一个人的旅行【最短路 dijkstra & floyed & SPFA 】
- HDU-2066-一个人的旅行(最短路,dijkstra)
- HDU2066_一个人的旅行(Dijkstra最短路)
- HDU 2066 一个人的旅行 dijkstra&&spfa
- HDU---2066-一个人的旅行(最短路)
- ACM->dijkstra + heap + stl 一个人的旅行 hdu 2066
- HDU 2066-一个人的旅行(Dijkstra)
- HDU 2544 最短路(单源最短路 dijkstra / floyd / dijkstra(堆优化)/dijkstra+邻接链表+堆优化)