题意杀...
Floyd
有N个石头,青蛙1位于第1块石头上,青蛙2位于第2块石头上,现在青蛙要从石头1经过一些跳跃到达石头2。要求一条从石头1到石头2的跳跃路径,使路径中两个石头的最长距离是最小的。
只要将d[i]的意义变为从1到i的最大边即可,然后修改下更新条件就可以了,dij或者flo都可以
Dij
#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 205
const int INF = 1<<30;
#define LL long long
int cas=1,T;
typedef struct Node
{
double x,y;
}Point;
Point point[maxn];
double d[maxn];
int n;
double caldist(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void dijkstra()
{
int vis[maxn];
int v = 1;
double min;
for (int i = 1;i<=n;i++)
{
d[i]=INF;
vis[i]=0;
}
d[1]=0;
for (int i = 1;i<=n;i++)
{
min = INF;
for (int j = 1;j<=n;j++)
{
if (!vis[j] && d[j] < min)
{
min = d[j];
v=j;
}
}
vis[v]=1;
if (v==2)
break;
for (int j = 1;j<=n;j++)
if (!vis[j] && d[j]>max(d[v],caldist(point[v],point[j])))
{
d[j] = max(d[v],caldist(point[v],point[j]));
}
}
}
int main()
{
while (scanf("%d",&n) && n)
{
for (int i = 1;i<=n;i++)
scanf("%lf%lf",&point[i].x,&point[i].y);
dijkstra();
printf("Scenario #%d\nFrog Distance = %.3lf\n\n",cas++,d[2]);
}
//freopen("in","r",stdin);
//scanf("%d",&T);
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}
Floyd
#include<cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 205
#define LL long long
int cas=1,T;
struct point
{
double x,y;
}p[205];
double dis[maxn][maxn];
int main()
{
int n;
while (scanf("%d",&n) && n)
{
printf("Scenario #%d\n",cas++);
memset(p,0,sizeof(p));
memset(dis,0,sizeof(dis));
for (int i = 1;i<=n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for (int i = 1;i<=n;i++)
for (int j = 1;j<=n;j++)
{
dis[i][j]=dis[j][i]=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x) + (p[i].y-p[j].y)*(p[i].y-p[j].y));
}
for (int k = 1;k<=n;k++)
for (int i = 1;i<=n;i++)
for (int j = 1;j<=n;j++)
{
if (dis[i][j] > max(dis[i][k],dis[k][j]))
dis[i][j] = max(dis[i][k],dis[k][j]);
}
printf("Frog Distance = %.3lf\n\n",dis[1][2]);
}
//freopen("in","r",stdin);
//scanf("%d",&T);
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return 0;
}