POJ - 2253
題目意思大體就是找一條路,這條路中每一跳都盡量的小。找到這條路中最大的邊
題目大意求青蛙由起點跳到終點的過程中,在所有的路徑中的最大步伐中的最小步伐。題目簡單。用Dijkstra算法解,但並非是求最小路徑或最
小路徑長度。這里是Dijkstra算法的變體,結合貪心算法的思想,在走每一步時,選取距離最小(即步伐最小)的那一步走,每一次走都是在上一步
的基礎之上走的,用一個變量u記錄每次通過的結點,再用一個變量記錄已經走了的路徑中的最大步伐,當u等於終點結點的編號時,就停止,輸出最大步伐。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 #include<cstdio> 6 using namespace std; 7 8 const int INF=0x3f3f3f3f; 9 int book[1005]; 10 double dis[1005],e[1005][1005]; 11 12 struct note 13 { 14 int x,y; 15 }p[1005]; 16 17 double length(note a,note b) 18 { 19 return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) ); 20 } 21 22 int main() 23 { 24 int n,cas=0; 25 while(cin>>n && n) 26 { 27 cas++; 28 memset(book,0,sizeof(book)); 29 memset(dis,0,sizeof(dis)); 30 for(int i=1;i<=n;i++) 31 for(int j=1;j<=n;j++) 32 e[i][j]=INF; 33 for(int i=1;i<=n;i++) 34 cin>>p[i].x>>p[i].y; 35 36 for(int i=1;i<=n;i++) 37 for(int j=1;j<=n;j++) 38 e[i][j] = length(p[i],p[j]); 39 40 for(int i=1;i<=n;i++) 41 dis[i]= e[1][i]; 42 dis[1]=0; 43 book[1]=1; 44 45 double maxn=0; 46 for(int i=2;i<=n;i++) 47 { 48 double minn=INF; 49 int u=1; //****** 50 for(int j=1;j<=n;j++) 51 { 52 if( !book[j] && dis[j]<minn) 53 { 54 minn=dis[j]; 55 u=j; 56 } 57 } 58 59 if(maxn<minn) maxn=minn; 60 if(u==2) break; //如果最短的是第2個點 則直接就到目的地了 61 book[u]=1; 62 63 for(int v=1;v<=n;v++) 64 { 65 if(!book[v] && dis[v]> e[u][v]) 66 dis[v]= e[u][v]; 67 } 68 } 69 70 printf("Scenario #%d\nFrog Distance = %.3f\n\n",cas,maxn); 71 } 72 }
