ACM-最短路之中的一个个人的旅行——hdu2066
https://blog.csdn.net/lx417147512/article/details/27235809
***************************************轉載請注明出處:http://blog.csdn.net/lttree***************************************
一個人的旅行
Time Limit: 1000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17559????Accepted Submission(s): 6062
Problem Description 盡管草兒是個路癡(就是在杭電待了一年多,居然還會在校園里迷路的人,汗~),但是草兒仍然非常喜歡旅行,由于在旅途中 會遇見非常多人(白馬王子。^0^)。非常多事。還能豐富自己的閱歷。還能夠看漂亮的風景……草兒想去非常多地方,她想要去東京鐵塔看夜景,去威尼斯看電影。去陽明山上看海芋,去紐約純粹看雪景,去巴黎喝咖啡寫信,去北京探望孟姜女……眼看寒假就快到了。這么一大段時間,可不能浪費啊,一定要給自己好好的放個假,但是也不能荒廢了訓練啊,所以草兒決定在要在最短的時間去一個自己想去的地方。由于草兒的家在一個小鎮上,沒有火車經過。所以她僅僅能去鄰近的城市坐火車(好可憐啊~)。
Input 輸入數據有多組,每組的第一行是三個整數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個數,表示草兒想去地方。
Output 輸出草兒能去某個喜歡的城市的最短時間。
Sample Input 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
Sample Output 9
Author Grass
題目:http://acm.hdu.edu.cn/showproblem.php?pid=2066
這道題,TLE N次。
。。
剛開始用Dijkstra ? TLE了居然。!
于是乎,想想難道Floyd??
算算時間,發現不正確啊,肯定TLE啊。
傻乎乎各種剪枝什么的。。結果。。。忘記EOF了= ?=。
。。
做提前還特地提醒過自己EOF的。。
后來不知怎么的就忘了。
。
。
就是求多起點,多目的地的最短路徑問題。
將 能到達的起點存入一個數組,將想去的目的地存入還有一個數組。
所以查找的復雜度就是 O(S*D)
我代碼是 46MS過的。
。。
/**************************************** ***************************************** * Author:Tree * *From :http://blog.csdn.net/lttree * * Title : 一個人的旅行 * *Source: hdu 2066 * * Hint : 最短路-Dijkstra * ***************************************** ****************************************/#include <stdio.h>#define RANGE 1001 #define MAX 0x3f3f3f3fint cost[RANGE][RANGE],d[RANGE]; bool used[RANGE]; int station[RANGE],to[RANGE]; int n;int Min( int a,int b) {return a<b?a:b; }void Dijkstra( int s ) {int i,u,v;for( i=1;i<=n;++i ){used[i]=false;d[i]=MAX;}d[s]=0;while( true ){v=-1;for( u=1;u<=n;++u )if( !used[u] && (v==-1 || d[u]<d[v]) )v=u;if( v==-1 ) break;if( d[v]==MAX ) break;used[v]=true;for( u=1;u<=n;++u )d[u]=Min( d[u],d[v]+cost[v][u] );} }int main() {int T,S,D,shortest;int i,j,a,b,c;while( scanf("%d%d%d",&T,&S,&D)!=EOF ){n=-1;for( i=1;i<RANGE;++i )for( j=1;j<RANGE;++j )if( i==j ) cost[i][j]=0;else cost[i][j]=MAX;for( i=0;i<T;++i ){scanf("%d%d%d",&a,&b,&c);// 找共同擁有多少個頂點n=a>n?
a:n; n=b>n?
b:n; if( c<cost[a][b] ) cost[a][b]=cost[b][a]=c; } for( i=0;i<S;++i ) scanf("%d",&station[i]); for( i=0;i<D;++i ) scanf("%d",&to[i]); shortest=MAX; for( i=0;i<S;++i ) { Dijkstra( station[i] ); for( j=0;j<D;++j ) shortest = d[ to[j] ] < shortest?
d[ to[j] ]:shortest; } printf("%d\n",shortest); } return 0; }
轉載于:https://www.cnblogs.com/ldxsuanfa/p/10757495.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的ACM-最短路之中的一个个人的旅行——hdu2066的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清晰讲解SQL语句中的外连接,通用于My
- 下一篇: 四元数研究