【POJ - 2253】Frogger(floyd,或 部分瓶颈生成树的最大边)
題干:
湖中有n塊石頭,編號從1到n,有兩只青蛙,Bob在1號石頭上,Alice在2號石頭上,Bob想去看望Alice,但由于水很臟,他想避免游泳,于是跳著去找她。但是Alice的石頭超出了他的跳躍范圍。因此,Bob使用其他石頭作為中間站,通過一系列的小跳躍到達她。兩塊石頭之間的青蛙距離被定義為兩塊石頭之間所有可能路徑上的最小必要跳躍距離,某條路徑的必要跳躍距離即這條路徑中單次跳躍的最遠跳躍距離。你的工作是計算Alice和Bob石頭之間的青蛙距離。
Input
多實例輸入?
先輸入一個整數n表示石頭數量,當n等于0時結束。
接下來2-n+1行依次給出編號為1到n的石頭的坐標xi , yi。
2 <= n <= 200?
0 <= xi , yi <= 1000
Output
先輸出"Scenario #x", x代表樣例序號。
接下來一行輸出"Frog Distance = y", y代表你得到的答案。?
每個樣例后輸出一個空行。
(ps:wa有可能是精度問題,g++不對可以用c++嘗試,都不對就是代碼問題)
Sample Input
2 0 0 3 43 17 4 19 4 18 50Sample Output
Scenario #1 Frog Distance = 5.000Scenario #2 Frog Distance = 1.414題目大意:
1為起點,2為終點,那么1~2的所有路徑,每條路徑的最大邊構成一個邊集E,讓你求E中的最小值。
解題報告:
? 這題可以直接跑MST,然后當1~2已經連通的時候就break就行了,這時候得到的就是答案。
? 法二跑個floyd稍微修改一下也行。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define F first #define S second #define ll long long #define pb push_back #define pm make_pair using namespace std; typedef pair<int,int> PII; const int MAX = 2e2 + 5; double dis[MAX][MAX]; int x[MAX],y[MAX],n; void floyd() {for(int k = 1; k<=n; k++) {for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {dis[i][j] = min(dis[i][j],max(dis[i][k],dis[k][j]));}}} } int main() {int iCase=0;while(~scanf("%d",&n) && n) {for(int i = 1; i<=n; i++)for(int j = 1; j<=n; j++) dis[i][j] = 999999999;for(int i = 1; i<=n; i++) {scanf("%d%d",x+i,y+i);for(int j = 1; j<i; j++) {dis[i][j] = dis[j][i] = sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));}} floyd();printf("Scenario #%d\n",++iCase);printf("Frog Distance = %.3f\n\n",dis[1][2]); }return 0 ; }?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【POJ - 2253】Frogger(floyd,或 部分瓶颈生成树的最大边)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PSof1.exe - PSof1是什么
- 下一篇: 【 POJ - 3628 】Booksh