这题二分的话,二分半径可以过,但是二分半径的平方就会跪,不知道为什么
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#define MAXN 255
#define MAXM 50005
#define INF 500000005
#define eps 1e-7
using namespace std;
struct P
{
int x, y;
}pa[MAXN], pb[MAXN];
vector<int>g[MAXN];
stack<int>st;
int n, scc, index;
int low[MAXN], dfn[MAXN], instack[MAXN];
int fa[MAXN];
double dist(P a, P b)
{
return sqrt(1.0 * ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)));
}
void init()
{
scc = index = 0;
while(!st.empty()) st.pop();
for(int i = 0; i < MAXN; i++) g[i].clear();
memset(dfn, 0, sizeof(dfn));
memset(instack, 0, sizeof(instack));
}
void tarjan(int u)
{
dfn[u] = low[u] = ++index;
instack[u] = 1;
st.push(u);
int v, size = g[u].size();
for(int i = 0; i < size; i++)
{
v = g[u][i];
if(!dfn[v])
{
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if(instack[v]) low[u] = min(low[u], dfn[v]);
}
if(dfn[u] == low[u])
{
scc++;
do
{
v = st.top();
st.pop();
fa[v] = scc;
instack[v] = 0;
}while(v != u);
}
}
void build(double mid)
{
for(int i = 1; i <= n; i++)
for(int j = i + 1; j <= n; j++)
{
if(dist(pa[i], pa[j]) + eps < 2 * mid) g[i].push_back(j + n), g[j].push_back(i + n);
if(dist(pa[i], pb[j]) + eps < 2 * mid) g[i].push_back(j), g[j + n].push_back(i + n);
if(dist(pb[i], pa[j]) + eps < 2 * mid) g[i + n].push_back(j + n), g[j].push_back(i);
if(dist(pb[i], pb[j]) + eps < 2 * mid) g[i + n].push_back(j), g[j + n].push_back(i);
}
}
bool check()
{
for(int i = 1; i <= 2 * n; i++)
if(!dfn[i]) tarjan(i);
for(int i = 1; i <= n; i++)
if(fa[i] == fa[i + n]) return false;
return true;
}
void solve()
{
double low = 0, high = 20000, ans = 0;
while(high - low > eps)
{
double mid = (low + high) / 2;
init();
build(mid);
if(check()) {ans = max(ans, mid); low = mid;}
else high = mid;
}
printf("%.2f\n", ans);
}
int main()
{
while(scanf("%d", &n) != EOF)
{
for(int i = 1; i <= n; i++) scanf("%d%d%d%d", &pa[i].x, &pa[i].y, &pb[i].x, &pb[i].y);
solve();
}
return 0;
}