SDOI2012 Round1 day2 拯救小云公主(dis)解题报告

 

 

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
typedef double real;

#define setfire(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
#define fre(name) freopen(#name".txt","r",stdin);
#define debug(x) cout<<#x<<" "<<x<<'\n';
#ifdef WIN32
#define LL "%I64d"
#else
#define LL "%lld"
#endif

const int N=3005;
const real inf=1e14;
struct M{int x,y;}a[N];
int n,row,line,S,T,q[N*30];bool vis[N*30];
real ans,g[N][N],dis[N];
double get_dis(M a,M b){
    int tx=a.x-b.x,ty=a.y-b.y;
    return sqrt(tx*tx+ty*ty);
}
void init(){
    scanf("%d%d%d",&n,&row,&line);S=n+1;T=S+1;
    for(int i=1,x,y;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
}
void mapping(){
    for(int i=1;i<=n;i++) 
//        g[S][i]=g[i][S]=min(a[i].x-1,row-a[i].x),//居然还90 
//        g[T][i]=g[i][T]=min(a[i].y-1,line-a[i].y);
        g[S][i]=g[i][S]=min(a[i].x-1,line-a[i].y),
        g[T][i]=g[i][T]=min(a[i].y-1,row-a[i].x);
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
            g[i][j]=g[j][i]=get_dis(a[i],a[j])/2.0;
    ans=inf;
    for(int i=1;i<=n;i++)
        ans=min(ans,get_dis(a[i],(M){1,1})),
        ans=min(ans,get_dis(a[i],(M){row,line}));
    g[S][T]=g[T][S]=min(row-1,line-1);
}
void spfa(){
    for(int i=1;i<=T;i++) vis[i]=0,dis[i]=inf;
    unsigned short h=0,t=1;real dl;
    q[t]=S;dis[S]=0;
    while(h!=t){
        int x=q[++h];vis[x]=0;//少打个标记90变30 
        for(int i=1;i<=T;i++){
            if(x!=i&&(dl=max(dis[x],g[x][i]))<dis[i]){
                dis[i]=dl;
                if(!vis[i]){
                    vis[i]=1;
                    q[++t]=i;
                }
            }
        }
    }
}
int main(){
    setfire(dis);
    init();
    mapping();
    spfa();
    ans=min(ans,dis[T]);
    printf("%.2lf",ans);
    return 0;
}

 

posted @ 2017-02-19 21:56  神犇(shenben)  阅读(418)  评论(0编辑  收藏  举报