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
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點的每條通路中的最長邊(集合)的最小值。