1. 程式人生 > >題解報告:hdu 2066 一個人的旅行

題解報告:hdu 2066 一個人的旅行

true esp wan 遇見 一個 bottom 很多 解題思路 表示

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 解題思路:用Dijkstra求最短時間。由題目中紅色字體可以知道草兒去相鄰城市所花費的時間是不計其中的,所以與之相鄰的邊都要初始化為0。因為a,b城市的起點編號有從1開始,所以我們將草兒家的編號設置為0,這樣就不會有沖突;並且由於輸入的城市編號無法直接從題目得知,因此需要取輸入城市編號的最大值,這樣問題求解變成求草兒家到各城市所花費的最短時間,最後的lowcost數組就是起點0到各點的最小時間,所以取其想要去的城市的最短時間輸出即可。註意:處理輸入時可能出現重邊的情況,因為題目已經說a,b之間可能有多條路
。 AC代碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN=1005;
 4 const int INF=0x3f3f3f3f;
 5 bool vis[MAXN];
 6 int T,S,D,Maxnum,lowcost[MAXN],cost[MAXN][MAXN],want[MAXN];
 7 void Dijkstra(){
 8     for(int i=0;i<=Maxnum;i++)
 9         lowcost[i]=cost[0][i];
10     lowcost[0
]=0;vis[0]=true; 11 for(int i=1;i<=Maxnum;++i){//遍歷剩下的Maxnum個節點 12 int k=-1; 13 for(int j=0;j<=Maxnum;++j) 14 if(!vis[j] && (k==-1||lowcost[k]>lowcost[j]))k=j; 15 if(k==-1)break;//表明所有節點已經全部找到,直接退出 16 vis[k]=true; 17 for(int j=0;j<=Maxnum;++j) 18 if(!vis[j])lowcost[j]=min(lowcost[j],lowcost[k]+cost[k][j]); 19 } 20 } 21 int main() 22 { 23 int x,y,z; 24 while(cin>>T>>S>>D){ 25 Maxnum=0; 26 memset(cost,0x3f,sizeof(cost));//初始化 27 for(int i=1;i<=T;++i){ 28 cin>>x>>y>>z; 29 Maxnum=max(max(Maxnum,x),y);//找出最大的城市編號 30 if(cost[x][y]>z)cost[x][y]=cost[y][x]=z;//可能有重邊 31 } 32 for(int i=1;i<=S;i++){//默認和草兒家相連的城市之間時間為0,因為實際花費時間是乘坐火車所用時間 33 cin>>x; 34 cost[0][x]=cost[x][0]=0; 35 } 36 memset(vis,false,sizeof(vis)); 37 for(int i=1;i<=D;i++)cin>>want[i]; 38 Dijkstra(); 39 int minn=INF; 40 for(int i=1;i<=D;i++)//想去某個城市的最短時間 41 minn=min(minn,lowcost[want[i]]); 42 cout<<minn<<endl; 43 } 44 return 0; 45 }

題解報告:hdu 2066 一個人的旅行