1. 程式人生 > >POJ 2253 Frogger

POJ 2253 Frogger

每條通路中的最長邊集合的最小值

再在這個最長邊的集合裡面找最小值。

意思就是說,不僅要去找通路,而且還要找到那條最長邊所在的通路。

【坑】那麼找到的可能不是每個通路里最長的那條邊,

因此只有把每個通路里最長的邊先找出來,才能進行比較。

首先再讀懂題目意思。

重點:只有兩個點,(就是題目給出的第一個資料和第二個資料)

剩下的點,全是我們要鬆弛的物件。

與POJ1797形成對比

問個問題,為什麼如下【變式】FLOYD演算法可以實現找每條通路中的最長邊集合的最小值】,並且輸出d[0][1]就是答案。

這裡的弗洛伊德思想,只要加進去一個點:【i點】控制的是我們要加入的點,既然加入了一個點,那麼就意味著多了兩條邊,於是首先在構成通路的當前新生成的兩條邊進行比較大小(找最大)。(此時已經形成了一個通路了。)

之後找到了最大值,我們再去和之前的那條邊進行比較,(找最小)。

這就是這道題的弗洛伊德的思想。

d[0][1]代表的意思就是,從0點到1點的每條通路中的最長邊(集合)的最小值。

#include"stdafx.h"

#include<iostream>

#include<vector>

#include<queue>

#include<string>

#include<algorithm>

#include<math.h>

#include<iomanip>

using namespace

 std;

double  x[300], y[300], m[300][300];

int t, i, j, k, c = 1;

int main()

{

while (cin >> t && t != 0) {

for (i = 0; i < 300; ++i)

for (j = 0; j < 300; ++j)

m[i][j] = 100000000;

for (i = 0; i < t; ++i)

cin >> x[i] >> y[i];

for(i=0;i<t;++i)

for (j = i + 1; j < t; ++j)

{

m[i][j] = m[j][i] = sqrt(abs(x[i] - x[j])*abs(x[i] - x[j]) + abs(y[i] - y[j])*abs(y[i] - y[j]));

//cout << m[i][j] << endl;

}

for (i = 0; i < t; ++i)

for (j = 0; j < t; ++j)

for (k = 0; k < t; ++k)

{

cout << m[j][k] << " " << m[i][k] << " " << m[i][j] << endl;

m[j][k] = min(m[j][k], max(m[i][k], m[i][j]));

}

cout << "Scenario #" << c++ << endl;

cout << setiosflags(ios::fixed) << setprecision(3) << "Frog Distance = " << m[0][1] << endl << endl;

}

return 0;

}

這就要涉及到題目意思了:

而且倘若是迪傑斯特拉,為什麼我們也要輸出dis[1],為什麼維護的是這個?思想和之前的弗洛伊德思想一模一樣。

dis[1]表示的意思也是從0點到1點的每條通路中的最長邊(集合)的最小值。