题意:有一只青蛙在坐标为(x0,y0)的石头上,他不想游泳,想跳去找在(x1,y1)石头上的青蛙女神,还有另外的n-2块石头,求青蛙要保证一步可以跳多远才能跳到青蛙女神处。
思路:我一开始是用kruskal算法做的,从长度最短的边开始连接,直到(x0,y0)到(x1,y1)有路径,即在同一棵数中,可以过。后来看了网上的题解,说这是一道单源最短路变形。G++编译,double 用了%.3lf 输出,一直不过,要用%.3f 输出。
#include
#include
#include
#include
//#define INF 0x7fffffff
using namespace std;
int n, m, fa[205];
struct Edge
{
int u, v;
double len;
}edge[40010];
int cmp(const void *a, const void *b)
{
return (*(Edge *)a).len > (*(Edge *)b).len ? 1 : -1;
}
int find(int x)
{
int temp = x;
while(x != fa[x])
{
x = fa[x];
}
fa[temp] = x; return x;
}
double kruskal()
{
for(int i = 0; i < n; i++) fa[i] = i;
qsort(edge, m, sizeof(edge[0]), cmp);
for(int i = 0; i < m; i++)
{
int x = find(edge[i].u), y = find(edge[i].v);
if(x != y)
{
fa[x] = y; //连线
}
if(find(0) == find(1))
{
return edge[i].len; //直到第0点可到达第1点
}
}
}
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif
double x[205], y[205], dist;
int t = 0;
while(scanf("%d", &n) != EOF && n)
{
m = 0;
for(int i = 0; i < n; i++)
{
scanf("%lf%lf", &x[i], &y[i]);
for(int j = 0; j < i; j++)
{
dist = sqrt((x[j] - x[i]) * (x[j] - x[i]) + (y[j] - y[i]) * (y[j] - y[i]));
edge[m].len = dist;
edge[m].u = i; edge[m].v = j;
//printf("%d-%d %lf\n", edge[m].u, edge[m].v ,edge[m].len);
m++;
}
}
t++;
printf("Scenario #%d\nFrog Distance = %.3f\n\n",
t, kruskal());
}
return 0;
}
#include
#include
#include
#define INF 1e8
int n, vis[205];
double dist[205][205], d[205];
//d[]记录跳到各个点所需的最小一步跳跃距离
double max(double a, double b)
{
return a > b ? a : b;
}
void dijkstra()
{
for(int i = 0; i < n; i++) d[i] = INF;
d[0] = 0;
for(int i = 0; i < n; i++)
{
double min = INF;
int u;
for(int j = 0; j < n; j++)
{//确定从第0个点跳到一个点所需的最小一步跳跃距离
if(!vis[j] && d[j] < min)
{
u = j; min = d[j];
}
}
vis[u] = 1;
if(u == 1) return;
for(int j = 0; j < n; j++)
{
//得到经过u点到各点的最小一步跳跃距离
double temp = max(d[u], dist[u][j]);
if(!vis[j] && d[j] > temp) //判断经过u点是否使最小一步跳跃距离变短
d[j] = temp;
}
}
}
int main()
{
#ifdef LOCAL
freopen("data.in", "r", stdin);
#endif
int x[205], y[205];
double temp;
int t = 1;
while(scanf("%d", &n) != EOF && n)
{
memset(dist, 0, sizeof(dist));
memset(vis, 0, sizeof(vis));
for(int i = 0; i < n; i++)
{
scanf("%d%d", &x[i], &y[i]);
for(int j = 0; j < i; j++)
{//求各点之间直接到达的距离
temp = sqrt((x[j] - x[i]) * (x[j] - x[i]) +
(y[j] - y[i]) * (y[j] - y[i]));
dist[i][j] = dist[j][i] = temp;
}
}
dijkstra();
printf("Scenario #%d\nFrog Distance = %.3f\n\n", t++, d[1]);
}
return 0;
}