弗洛伊德思想题目
Posted ylrwj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了弗洛伊德思想题目相关的知识,希望对你有一定的参考价值。
湖中有n块石头,编号从1到n,有两只青蛙,Bob在1号石头上,Alice在2号石头上,Bob想去看望Alice,但由于水很脏,他想避免游泳,于是跳着去找她。但是Alice的石头超出了他的跳跃范围。因此,Bob使用其他石头作为中间站,通过一系列的小跳跃到达她。两块石头之间的青蛙距离被定义为两块石头之间所有可能路径上的最小必要跳跃距离,某条路径的必要跳跃距离即这条路径中单次跳跃的最远跳跃距离。你的工作是计算Alice和Bob石头之间的青蛙距离。
Input
多实例输入
先输入一个整数n表示石头数量,当n等于0时结束。
接下来2-n+1行依次给出编号为1到n的石头的坐标xi , yi。
2 <= n <= 200
0 <= xi , yi <= 1000
先输入一个整数n表示石头数量,当n等于0时结束。
接下来2-n+1行依次给出编号为1到n的石头的坐标xi , yi。
2 <= n <= 200
0 <= xi , yi <= 1000
Output
先输出"Scenario #x", x代表样例序号。
接下来一行输出"Frog Distance = y", y代表你得到的答案。
每个样例后输出一个空行。
(ps:wa有可能是精度问题,g++不对可以用c++尝试,都不对就是代码问题)
接下来一行输出"Frog Distance = y", y代表你得到的答案。
每个样例后输出一个空行。
(ps:wa有可能是精度问题,g++不对可以用c++尝试,都不对就是代码问题)
Sample Input
2 0 0 3 4 3 17 4 19 4 18 5 0
Sample OutputScenario #1
Frog Distance = 5.000 Scenario #2 Frog Distance = 1.414
题解:
该题所给相当于石头坐标,求两点间的距离,即求出三角形的最长边,然后在这些边中求最短路;
//因为是坐标,两点间距离为三角形最长边,求出所有最长边的最小值 #include <iostream> #include <cstdio> #include <cstring> #define inf 1e18 #include<algorithm> #include<cmath> using namespace std ; int n; int w[250][250],dis[250]; //w数组记录i-j的距离 ,dis数组记录并更新 bool vis[250]; //标记作用, struct node { int x; int y; }p[250]; double dist(node a,node b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } void dijkstra() //核心代码 { memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) dis[i]=w[1][i]; //初始化dis数组,1到各个顶点的距离 for(int i=1;i<=n;i++) { int u,m=inf; for(int j=1;j<=n;j++) if(!vis[j]&&dis[j]<=m) m=dis[u=j]; vis[u]=1; for(int j=1;j<=n;j++) { int k=max(dis[u],w[u][j]); dis[j]=min(k,dis[j]); } } } int main() { int q=1; while(cin>>n) { if(n==0)break; for(int i=1;i<=n;i++) cin>>p[i].x>>p[i].y; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) w[i][j]=dist(p[i],p[j]); dijkstra(); cout<<"Scenario #"<<q++<<endl; cout<<"Frog Distance = "; printf("%.3f ",sqrt(dis[2])); } return 0; }
以上是关于弗洛伊德思想题目的主要内容,如果未能解决你的问题,请参考以下文章