寒假集训最短路Dfrogger

弗雷迪青蛙坐在湖中央的一块石头上。突然他注意到Fiona Frog正坐在另一块石头上。他打算去看她,但因为水很脏,而且到处都是游客的防晒霜,他想避免游泳,而是跳过去接近她。
不幸的是菲奥娜的石头不在他的射程之内。因此弗雷迪考虑使用其他石头作为中间站,并通过一系列的小跳跃到达她。要执行给定的跳跃序列,青蛙的跳跃范围显然必须至少与序列中发生的最长跳跃相同长。
因此,青蛙与石头之间的距离(人类也称之为极小极大距离)被定义为两石头之间所有可能路径上的最小必要跳跃距离。给你弗雷迪的石头,菲奥娜的石头和湖里所有其他石头的坐标。你的工作是计算弗雷迪和菲奥娜石头之间的青蛙距离。
输入
输入将包含一个或多个测试用例。每个测试用例的第一行将包含石头的数量n (2<=n<=200)。接下来的n行每一行都包含两个整数习,yi(0 <=习,yi <= 1000)表示石头1的坐标。1号石头是弗雷迪的,2号石头是菲奥娜的,其他n-2号石头都空着。每个测试用例后面都有一行空白。对于n,输入以一个值0(0)结束。
输出
对于每个测试用例,打印一行“Scenario #x”和一行“Frog Distance = y”,其中x替换为测试用例号(它们的编号是从1开始的),y替换为适当的实数,打印到三个小数。在每个测试用例之后,甚至在最后一个测试用例之后,放一行空白。2
0 0
3 4

3
17 4
19 4
18 5

0

Scenario #1
Frog Distance = 5.000

Scenario #2
Frog Distance = 1.414
答案
问题:为什么要先选取最小的值(这里如果不求最短路那么应该不是完全按照dij那样写呀?)
照理说选出的dx肯定比所有dy都小为什么还要比较dx与gxy不直接比较dy与gxy呢?
两点不太理解,开学问一下别人把



#include <iostream>

#include <cstdio>

#include <cstring>

#include <cstdlib>

#include <queue>

#include <algorithm>

#include <cmath>

#include <string>

#include <map>

#include <cmath>

using namespace std;

 

const int maxn = 220;

 

const double INF = 1e60;

 

int n;

double G[maxn][maxn], d[maxn];

 

struct Pos {

   
int x, y;

}num[maxn];

 

double calc(int i, int j) {

   
return (sqrt(pow((double)num[i].x-num[j].x,
2)+pow((double)num[i].y-num[j].y, 2)));

}

 

double dijkstra() {

   
bool vis[maxn];

   


   
memset(vis, false, sizeof(vis));

 

   
for(int i=0; i<n; i++) {

       
d[i] = G[0][i];

   
}

 

   
d[0] = 0;

   
vis[0] = true;

 

   
for(int i=0; i<n-1; i++) {

       
double m = INF; int x;

       
for(int y=0; y<n; y++) if(!vis[y] && m >= d[y]) m =
d[x=y];

       
vis[x] = true;

       
for(int y=0; y<n; y++){

            if(!vis[y]) {

                double maxx = max(d[x],
G[x][y]);

                if(d[y] > maxx) d[y] = maxx;

            }

       
}

   
}

   


   
return d[1];

}

 

int main() {

   
int cnt = 0;

   
while(scanf("%d", &n) == 1) {

       
if(n == 0) break;

 

       
for(int i=0; i<n; i++) scanf("%d%d", &num[i].x,
&num[i].y);

 

       
for(int i=0; i<n; i++) {

            for(int j=0; j<i; j++) {

                G[i][j] = G[j][i] = calc(i, j);

            }

            G[i][i] = 0;

       
}

 

       
printf("Scenario #%d\nFrog Distance = %.3f\n\n", ++cnt,
dijkstra());

   
}

 

   
return 0;

}


猜你喜欢

转载自blog.csdn.net/weixin_43331783/article/details/87855927