多种方法,可以理解为最短路变形。
也可以当作最小生成树。
题意理解就很简单。
青蛙A到青蛙B之间距离中某一次跳的距离,选出最大的。
写了2个最短路的。SPFA 和 Dijkstra。
顺便熟悉一下最小生成树,也写个Kruskal 的。
SPFA:
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
using namespace std;
int n,m;
struct node
{
double x,y;
}l[201];
struct lx
{
int v;
double d;
};
vector<lx> g[201];
void SPFA(int start)
{
double dis[201];
bool vis[201];
for(int i=1;i<=n;i++)
dis[i]=INF,vis[i]=0;
queue<int>q;
dis[start]=0,vis[start]=1;
q.push(start);
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=0;
for(int j=0;j<g[u].size();j++)
{
int v=g[u][j].v;
double d=g[u][j].d;
if(dis[v]>max(dis[u],d))
{
dis[v]=max(dis[u],d);
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
printf("Scenario #%d\nFrog Distance = %.3f\n\n",m++,dis[2]);
}
int main()
{
m=1;
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&l[i].x,&l[i].y);
g[i].clear();
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
double d=sqrt(pow(l[i].x-l[j].x,2)+pow(l[i].y-l[j].y,2));
lx now;
now.d=d;
now.v=j;g[i].push_back(now);
now.v=i;g[j].push_back(now);
}
}
SPFA(1);
}
}
Dijkstra:
#include <cstdio>
#include <cmath>
#include <algorithm>
#define inf 0x7ffffff
#define MAXV 210
using namespace std;
struct lx
{
double x,y;
} point[MAXV];
double d[MAXV];
int n;
void dijkstra()
{
int i,j,vis[MAXV],v=1;
double min;
for(i=1; i<=n; i++)
{
d[i]=inf;
vis[i]=0;
}
d[1]=0;
for(i=1; i<=n; i++)
{
min=inf;
for(j=1; j<=n; j++)
if(!vis[j] && d[j]<min)
{
min=d[j];
v=j;
}
vis[v]=1;
if(v==2) break;
for(j=1; j<=n; j++)
{
double len=sqrt(pow(point[v].x-point[j].x,2)+pow(point[v].y-point[j].y,2));
if(!vis[j] && d[j]>max(d[v],len))
{
d[j]=max(d[v],len);
}
}
}
}
int main()
{
int i,cnt=1;
while(scanf("%d",&n) ,n)
{
for(i=1; i<=n; i++) scanf("%lf%lf",&point[i].x,&point[i].y);
dijkstra();
printf("Scenario #%d\nFrog Distance = %.3lf\n\n",cnt++,d[2]);
}
return 0;
}
Kruskal:
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
using namespace std;
int n,m;
int fa[201];
struct lx
{
double x,y;
}point[201];
struct edge
{
int u,v;
double len;
}l[20101];
int father(int x)
{
if(x!=fa[x])
fa[x]=father(fa[x]);
return fa[x];
}
bool cmp(edge a,edge b)
{
return a.len<b.len;
}
int main()
{
int m=1;
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
scanf("%lf%lf",&point[i].x,&point[i].y);
for(int i=1;i<=n;i++)
fa[i]=i;
int edgecot=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
l[edgecot].u=i;
l[edgecot].v=j;
l[edgecot++].len=sqrt(pow(point[i].x-point[j].x,2)+pow(point[i].y-point[j].y,2));
}
sort(l,l+edgecot,cmp);
double ans=0;
for(int i=0;i<edgecot;i++)
{
int x=l[i].u;
int y=l[i].v;
double len=l[i].len;
int fx=father(x);
int fy=father(y);
if(fx==fy)continue;
fa[fy]=fx;
if(father(1)==father(2))
{
ans=len;break;
}
}
printf("Scenario #%d\nFrog Distance = %.3f\n\n",m++,ans);
}
}