标签:道路 nbsp scanf pre ash 漂亮 include mic 半径
题目描述
输入
输出
样例输入
1 3 3
2 2
样例输出
1.00
题解
二分+对偶图+并查集
答案显然满足单调性,所以可以二分答案,然后考虑判定。
如果能够从左下角走到右上角并且不经过每个半径为mid的圆,即原图中左下角和右上角连通,等价于对偶图中左上部分和右下部分不连通。
而对偶图就是圆面积,因此判定两个圆以及圆与直线是否有公共部分,如果有则连边。最后使用并查集判断即可。
#include <cstdio> #include <algorithm> #define N 3010 using namespace std; int f[N]; double x[N] , y[N]; int find(int x) { return x == f[x] ? x : f[x] = find(f[x]); } void merge(int x , int y) { int tx = find(x) , ty = find(y); if(tx != ty) f[tx] = ty; } int main() { int n , i , j , cnt = 60; double a , b , l = 0 , r , mid; scanf("%d%lf%lf" , &n , &a , &b) , r = min(a , b); for(i = 1 ; i <= n ; i ++ ) scanf("%lf%lf" , &x[i] , &y[i]); while(cnt -- ) { mid = (l + r) / 2; for(i = 0 ; i <= n + 1 ; i ++ ) f[i] = i; for(i = 1 ; i <= n ; i ++ ) { if(mid >= x[i] - 1 || mid >= b - y[i]) merge(i , 0); if(mid >= a - x[i] || mid >= y[i] - 1) merge(i , n + 1); for(j = 1 ; j < i ; j ++ ) if((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) <= 4 * mid * mid) merge(i , j); } if(find(0) == find(n + 1)) r = mid; else l = mid; } printf("%.2lf\n" , l); return 0; }
标签:道路 nbsp scanf pre ash 漂亮 include mic 半径
原文地址:http://www.cnblogs.com/GXZlegend/p/7392147.html