【POJ - 2253】Frogger (Floyd算法)
【POJ – 2253】Frogger (Floyd算法)
–>Frogger
中文翻译
Descriptions:
Input
先输入一个整数n表示石头数量,当n等于0时结束。
接下来2-n+1行依次给出编号为1到n的石头的坐标xi , yi。
2 <= n <= 200
0 <= xi , yi <= 1000
Output
接下来一行输出”Frog Distance = y”, y代表你得到的答案。
每个样例后输出一个空行。
(ps:wa有可能是精度问题,g++不对可以用c++尝试,都不对就是代码问题)
Sample Input
2 0 0 3 4 3 17 4 19 4 18 5 0
Sample Output
Scenario #1 Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414
题目链接:
https://vjudge.net/problem/POJ-2253
我也是第一次做这样的题,用到一个算法
用Floyd算法求出两两最短路,再求出从每个点开始的最长路,最后从这n个最长路中求出最小的那个即为所求。
AC代码:
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 205 using namespace std; struct node { double x,y; }; node points[Maxn]; double path[Maxn][Maxn];//两点间的权值 int cases=1; int n; //Floyd算法 void floyd() { for(int k=1; k<=n; k++) //主要针对由i到j的松弛,最终任意两点间的权值都会被分别松弛为最大跳的最小(但每个两点的最小不一定相同) for(int i=1; i<=n-1; i++) for(int j=i+1; j<=n; j++) //当边ik,kj的权值都小于ij时,则走i->k->j路线,否则走i->j路线 if(path[i][k]<path[i][j]&&path[k][j]<path[i][j]) //当走i->k->j路线时,选择max{ik,kj},只有选择最大跳才能保证连通 if(path[i][k]<path[k][j]) path[i][j]=path[j][i]=path[k][j]; else path[i][j]=path[j][i]=path[i][k]; } int main() { while(cin>>n,n) { for(int i=1; i<=n; i++) cin>>points[i].x>>points[i].y; for(int i=1; i<=n-1; i++) for(int j=i+1; j<=n; j++) { //两点间的距离 double tx=points[j].x-points[i].x; double ty=points[j].y-points[i].y; path[i][j]=path[j][i]=sqrt(tx*tx+ty*ty);//双向性 } floyd(); cout<<"Scenario #"<<cases++<<endl; printf("Frog Distance = %.3lf\n\n",path[1][2]); } }