#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
int a[250][2],temp,n,c[55000];
int jud(int x,int y,int xx,int yy)
{
return ((x-xx)*(x-xx)+(y-yy)*(y-yy))<=temp?1:0;
}
queue<int>que;
int bfs()
{
int book[250];
memset(book,0,sizeof(book));
while(!que.empty()) que.pop();
que.push(1);book[1]=1;
while(!que.empty())
{
int p=que.front();que.pop();
for(int i=1;i<=n;i++)
{
if(!book[i]&&jud(a[p][0],a[p][1],a[i][0],a[i][1]))
{
if(i==2) return 1;
book[i]=1;
que.push(i);
}
}
}
return 0;
}
int main()
{
int ca=1;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++) scanf("%d%d",&a[i][0],&a[i][1]);
int num=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j) c[num++]=(a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]);
sort(c,c+num);
float ans;
for(int i=0;i<num;i++) //枚举最小长度
{
temp=c[i];
if(bfs()) {ans=sqrt(c[i]);break;} //广搜判断能否联通图
}
printf("Scenario #%d\nFrog Distance = %.3f\n\n",ca++,ans);
}
return 0;
}
图论的东西,flod简单代码就能过。(补下)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=200;
int a[N+10][2];
int dis[N+10][N+10];
int main()
{
int n,ca=1;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++) scanf("%d%d",&a[i][0],&a[i][1]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=(a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]);
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(max(dis[i][k],dis[k][j])<dis[i][j])
dis[i][j]=max(dis[i][k],dis[k][j]);
printf("Scenario #%d\n",ca++);
printf("Frog Distance = %.3f\n\n",sqrt(dis[1][2]));
}
return 0;
}//floyd
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=200;
int a[N+10][2];
int dis[N+10][N+10];
int dij(int n)
{
int v[N+10],d[N+10];
for(int i=1;i<=n;i++) d[i]=dis[1][i];
memset(v,0,sizeof(v));
v[1]=1;
for(int i=2;i<=n;i++)
{
int minn=999999999,pos;
for(int j=1;j<=n;j++)
{
if(!v[j]&&d[j]<minn)
{
minn=d[j];pos=j;
}
}
v[pos]=1;
for(int j=1;j<=n;j++)
{
if(d[j]>max(d[pos],dis[pos][j])) d[j]=max(d[pos],dis[pos][j]);
}
}
return d[2];
}
int main()
{
int n,ca=1;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++) scanf("%d%d",&a[i][0],&a[i][1]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=(a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]);
printf("Scenario #%d\n",ca++);
printf("Frog Distance = %.3f\n\n",sqrt(dij(n)));
}
return 0;
}//dij
flody类似dp,dij类似贪心,复杂度n3->n2。