POJ 2253 Floyd算法创新(1)

Frogger
TimeLimit:1000MS MemoryLimit:65536K
64-bit integer IO format:%lld
Problem Description
Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her, but since the water is dirty and full of tourists’ sunscreen, he wants to avoid swimming and instead reach her by jumping.
Unfortunately Fiona’s stone is out of his jump range. Therefore Freddy considers to use other stones as intermediate stops and reach her by a sequence of several small jumps.
To execute a given sequence of jumps, a frog’s jump range obviously must be at least as long as the longest jump occuring in the sequence.
The frog distance (humans also call it minimax distance) between two stones therefore is defined as the minimum necessary jump range over all possible paths between the two stones.

You are given the coordinates of Freddy’s stone, Fiona’s stone and all other stones in the lake. Your job is to compute the frog distance between Freddy’s and Fiona’s stone.
Input
The input will contain one or more test cases. The first line of each test case will contain the number of stones n (2<=n<=200). The next n lines each contain two integers xi,yi (0 <= xi,yi <= 1000) representing the coordinates of stone #i. Stone #1 is Freddy’s stone, stone #2 is Fiona’s stone, the other n-2 stones are unoccupied. There’s a blank line following each test case. Input is terminated by a value of zero (0) for n.
Output
For each test case, print a line saying “Scenario #x” and a line saying “Frog Distance = y” where x is replaced by the test case number (they are numbered from 1) and y is replaced by the appropriate real number, printed to three decimals. Put a blank line after each test case, even after the last one.
SampleInput
2
0 0
3 4

3
17 4
19 4
18 5

0
SampleOutput
Scenario #1
Frog Distance = 5.000

Scenario #2
Frog Distance = 1.414

题意:给你n个点的坐标,第一和第二个分别是起点和终点 其余是青蛙可以在起点到终点路程中经过的点 (可以过也可以不过)
问的是青蛙到终点的过程中最小跳跃距离,这里指的是点与点之间的跳跃距离不是起点与终点的距离。
思路:因为点数不多,可以跑Floyd预处理出所有存在的边的长度得到最短路…难点在于想到构建边 有这个思路其实就蛮简单的
下面献上我的low逼代码

#include 
#include 
#include 
#include 
#include 
using namespace std;

double mp[205][205];
double x[205];
double y[205];

double mymax(double a, double b)///double型大小比较还是自己手写比较稳一点
{
	return a < b? b:a;
}

void flyod(int n)
{
	for(int k = 0; k < n; k++)
	{
		for(int i = 0; i < n; i++)
		{
			for(int j = 0; j < n; j++)
			{
				if(mp[i][j] > mp[i][k]&&mp[i][j]>mp[k][j])
				{
					mp[i][j] = mymax(mp[i][k], mp[k][j]);/将点进行松弛 这样一定使得答案更小
				}
			}
		}
	}
}

int main()
{
	int n;
	int cas = 1;
	while(cin >> n && n)
	{
		memset(mp, 0, sizeof(mp));///初始化
		memset(x, 0, sizeof(x));
		memset(y, 0, sizeof(y));
		
		for(int i = 0; i < n; i++)
			cin>>x[i]>>y[i];
			
		for(int i = 0; i < n; i++)
		{
			for(int j = i + 1; j < n; j++)
			{
				mp[i][j] = (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]);
				mp[j][i] = mp[i][j];///建图建双向边
			}
		}
		
		flyod(n);
		
		cout<<"Scenario #"<

你可能感兴趣的:(图论)