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; }