您的位置:首页 > 其它

poj2253 Frogger 图论,Floyd

2014-07-19 23:26 429 查看
题目链接:http://poj.org/problem?id=2253

题目大意:有两只青蛙和若干块石头,现在已知这些东西的坐标,两只青蛙A坐标和青蛙B坐标是第一个和第二个坐标,现在A青蛙想要到B青蛙那里去,并且A青蛙可以借助任意石头的跳跃。对于从A到B的每条通路,都存在一个最大边,让求这些最大边的最小的一个。

思路:Floyd算法的变形,只要变形松弛操作就可以了

///2014.7.19
///poj2253

//Accepted  1080K   79MS    G++ 1199B   2014-07-19 23:22:04

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

int cases;
int n;
double dist[210][210];

int coor_x[210],coor_y[210];

void init(){
for(int i=0 ; i<n ; i++)
scanf("%d%d",&coor_x[i],&coor_y[i]);
for(int i=0 ; i<n ; i++){
for(int j=i+1 ; j<n ; j++){
int x = (coor_x[i]-coor_x[j])*(coor_x[i]-coor_x[j]);
int y = (coor_y[i]-coor_y[j])*(coor_y[i]-coor_y[j]);
dist[i][j] = dist[j][i] = sqrt(x+y);
}
}
}

void floyd(){
for(int k=0 ; k<n ; k++){
for(int i=0 ; i<n ; i++){
for(int j=0 ; j<n ; j++){
if( dist[i][k]<dist[i][j] && dist[k][j]<dist[i][j] ){
dist[i][j] = dist[j][i] = dist[i][k]>dist[k][j] ? dist[i][k]:dist[k][j];
}
}
}
}
}

void output(){
cout<<"Scenario #"<<cases<<endl;
printf("Frog Distance = %.3f\n\n",dist[0][1]);
}

int main(){
cases = 0;
while( cin>>n && n ){
cases++;
init();
floyd();
output();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: