题目链接:点击打开链接
题意:
注意,这次不是让求最短路径,而是让求到达终点所需的最长的路径最短。
思路:
变相的floyd算法, 只需将判断条件改为if(dis[i][k] < dis[i][j] && dis[k][j] < dis[i][j])即可。
代码中函数名写的是bellman 不用理会。。。
#include <iostream>
#include<math.h>
#include<string.h>
#include <iomanip>
using namespace std;
const int inf = 0x3f3f3f3f;
double dis[210][210];
int v[210], u[210], n;
double gougu(int x, int y, int x2, int y2)
{
return sqrt(pow((double)(x-x2),2)+pow(y-y2,2));
}
void bellman()
{
for(int k = 0;k < n;k++)
for(int i = 0;i < n-1;i++)
for(int j = i+1;j < n;j++)
if(dis[i][k] < dis[i][j] && dis[k][j] < dis[i][j])
dis[i][j] = dis[j][i] = max(dis[i][k],dis[k][j]);
}
int main()
{
while(cin>>n,n)
{
static int count = 1;
for(int i = 0;i < n;i++)
cin>>u[i]>>v[i];
for(int i = 0;i < n-1;i++)
for(int j = i+1;j < n;j++)
{
dis[i][j] = dis[j][i] = gougu(u[i],v[i],u[j],v[j]);
}
bellman();
cout<<"Scenario #"<<count++<<endl;
cout<<fixed<<setprecision(3)<<"Frog Distance = "<<dis[0][1]<<endl;
cout<<endl;
}
return 0;
}