0
点赞
收藏
分享

微信扫一扫

Froggy Ford Gym - 100851F

​​http://codeforces.com/gym/100851/attachments​​

青蛙过河 n个石头 当作n个点 任意两点之间都有边 边的花费即为两点欧式距离 现在可以在任意位置加一个石头 使过河的最大边花费最小

先从两岸分别跑一遍最短路 然后n^2的暴力枚举 看新加的石头加在原有石头i和j的中点后的花费是多少即可

注意下一边界即可

 

#include <bits/stdc++.h>
using namespace std;
const double N=1000000000000000000.0;
const int maxn=1e3+10;

struct node
{
bool friend operator < (node n1,node n2){
return n1.val>n2.val;
}
int id;
double val;
};

priority_queue <node> que;
double e[maxn][maxn];
double x[maxn],y[maxn],dis1[maxn],dis2[maxn];
double w;
int book[maxn];
int n;

double getdis(double x1,double y1,double x2,double y2)
{
return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}

void dijkstra(double *dis,int s)
{
node cur,tmp;
double w;
int i,u,v;
while(!que.empty()) que.pop();
for(i=1;i<=n;i++) dis[i]=N;
memset(book,0,sizeof(book));
dis[s]=0.0;
tmp.id=s,tmp.val=dis[s];
que.push(tmp);
while(!que.empty()){
cur=que.top();
que.pop();
u=cur.id;
if(book[u]) continue;
book[u]=1;
for(v=1;v<=n;v++){
w=e[u][v];
if(u!=v&&!book[v]&&dis[v]>max(dis[u],w)){
dis[v]=max(dis[u],w);
tmp.id=v,tmp.val=dis[v];
que.push(tmp);
}
}
}
}

int main()
{
double ans,px,py;
int i,j;
freopen("froggy.in","r",stdin);
freopen("froggy.out","w",stdout);
scanf("%lf%d",&w,&n);
if(n==0){
printf("%.3f %.3f\n",w/2.0,0.0);
}
else{
for(i=2;i<=n+1;i++) scanf("%lf%lf",&x[i],&y[i]);
n+=2;
e[1][n]=e[n][1]=w;
for(i=2;i<=n-1;i++){
e[1][i]=e[i][1]=x[i];
e[i][n]=e[n][i]=w-x[i];
}
for(i=2;i<=n-1;i++){
for(j=i+1;j<=n-1;j++){
e[i][j]=e[j][i]=getdis(x[i],y[i],x[j],y[j]);
}
}
dijkstra(dis1,1);
dijkstra(dis2,n);
ans=N;
for(i=2;i<=n-1;i++){
for(j=2;j<=n-1;j++){
if(i!=j){
if(ans>max(e[i][j]/2.0,max(dis1[i],dis2[j]))){
ans=max(e[i][j]/2.0,max(dis1[i],dis2[j]));
px=(x[i]+x[j])/2.0,py=(y[i]+y[j])/2.0;
}
}
}
}
for(i=2;i<=n-1;i++){
if(ans>max(x[i]/2.0,dis2[i])){
ans=max(x[i]/2.0,dis2[i]);
px=x[i]/2.0,py=y[i];
}
if(ans>max(dis1[i],(w-x[i])/2.0)){
ans=max(dis1[i],(w-x[i])/2.0);
px=x[i]+(w-x[i])/2.0,py=y[i];
}
}
printf("%.3f %.3f\n",px,py);
}
return 0;
}

/*
10 0

10 2
2 1
2 4
*/

 


举报

相关推荐

0 条评论