标签:
1 3 3 2 3 4 3 1 5 4 1 1 2 2 3 3
2.236068
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
#include<bitset>
using namespace std;
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define CLEAR( a , x ) memset ( a , x , sizeof a )
typedef long long LL;
typedef pair<int,int>pil;
const int maxn = 55;
const int maxnnode=maxn*maxn;
const int mod = 1000000007;
const double eps=1e-8;
int K;
struct DLX{
int n,m,size;
int U[maxnnode],D[maxnnode],L[maxnnode],R[maxnnode],Row[maxnnode],Col[maxnnode];
int H[maxn],S[maxn];//H[i]位置,S[i]个数
int ansd,ans[maxn];
void init(int a,int b)
{
n=a; m=b;
REPF(i,0,m)
{
S[i]=0;
U[i]=D[i]=i;
L[i]=i-1;
R[i]=i+1;
}
R[m]=0; L[0]=m;
size=m;
REPF(i,1,n)
H[i]=-1;
}
void link(int r,int c)
{
++S[Col[++size]=c];
Row[size]=r;
D[size]=D[c];
U[D[c]]=size;
U[size]=c;
D[c]=size;
if(H[r]<0) H[r]=L[size]=R[size]=size;
else
{
R[size]=R[H[r]];
L[R[H[r]]]=size;
L[size]=H[r];
R[H[r]]=size;
}
}
void remove(int c)
{
for(int i=D[c];i!=c;i=D[i])
L[R[i]]=L[i],R[L[i]]=R[i];
}
void resume(int c)
{
for(int i=U[c];i!=c;i=U[i])
L[R[i]]=R[L[i]]=i;
}
bool v[maxnnode];
int f()
{
int ret = 0;
for(int c = R[0];c != 0;c = R[c])v[c] = true;
for(int c = R[0];c != 0;c = R[c])
if(v[c])
{
ret++;
v[c] = false;
for(int i = D[c];i != c;i = D[i])
for(int j = R[i];j != i;j = R[j])
v[Col[j]] = false;
}
return ret;
}
bool Dance(int d)
{
if(d + f() > K)return false;
if(R[0] == 0)return d <= K;
int c = R[0];
for(int i = R[0];i != 0;i = R[i])
if(S[i] < S[c])
c = i;
for(int i = D[c];i != c;i = D[i])
{
remove(i);
for(int j = R[i];j != i;j = R[j])remove(j);
if(Dance(d+1))return true;
for(int j = L[i];j != i;j = L[j])resume(j);
resume(i);
}
return false;
}
};
struct point{
int x,y;
}X[maxn],Y[maxn];
DLX L;
int T,N,M;
double dis(point a,point b)
{
return sqrt((double)(a.x-b.x)*(a.x-b.x)+(double)(a.y-b.y)*(a.y-b.y));
}
void solve()
{
double l=0,r=1e8;
while(r-l>=eps)
{
double mid=(l+r)/2;
L.init(M,N);
for(int i=1;i<=M;i++)
{
for(int j=1;j<=N;j++)
{
if(dis(X[i],Y[j])<mid-eps)
L.link(i,j);
}
}
if(L.Dance(0)) r=mid-eps;
else l=mid+eps;
}
printf("%.6lf\n",l);
}
int main()
{
int x,y;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&N,&M,&K);
REPF(i,1,N)
{
scanf("%d%d",&x,&y);
Y[i].x=x;Y[i].y=y;
}
REPF(i,1,M)
{
scanf("%d%d",&x,&y);
X[i].x=x;X[i].y=y;
}
solve();
}
return 0;
}
1 3 3 2 3 4 3 1 5 4 1 1 2 2 3 3
2.236068
标签:
原文地址:http://blog.csdn.net/u013582254/article/details/42133491