#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
#define maxm 500*900
#define maxn 999
#define eps 0.000000001
#define INF 0x7fffffff
struct Ci
{
double x,y;
}city[500];
struct Rai
{
double x,y;
}ra[500];
int R[maxm],L[maxm],U[maxm],D[maxm],col[maxm],row[maxm],sz;
int S[maxn];
int min_ans;
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]] = i;
R[L[i]] = i;
}
}
int h() {
bool hash[99] = {};
memset(hash,false,sizeof(hash));
int ret = 0;
for(int c = R[0] ; c != 0 ; c = R[c]) {
if(hash[c]) continue;
ret ++;
hash[c] = true;
for(int i = D[c] ; i != c ; i = D[i]) {
for(int j = R[i] ; j != i ; j = R[j]) {//puts("123");
hash[col[j]] = true;
}
}
}
return ret;
}
bool dfs(int deep,int lim) {
//printf("%d..\n",h());
if(deep + h() > lim) return false;
if(R[0] == 0) return true;
int i,j,idx,MM = 99999;
for(i = R[0] ; i != 0 ; i = R[i]) {
if(S[i] < MM) {
MM = S[i];
idx = i;
}
}
for(i = D[idx] ; i != idx; i = D[i]) {
remove(i);
for(j = R[i] ; j != i ; j = R[j]) {
remove(j);
}
if(dfs(deep+1,lim)) {
return true;
}
for(j = L[i] ; j != i ; j = L[j]) {
resume(j);
}
resume(i);
}
return false;
}
void Insert(int i,int j,int &first) {// 行数i通常用不到
if(first == -1) {
first = sz;
}
L[sz] = sz - 1;
R[sz] = sz + 1;
D[sz] = j;
D[U[j]] = sz;
U[sz] = U[j];
U[j] = sz;
col[sz] = j;
row[sz] = i;
S[j] ++;
sz ++;
}
void init(int n) {//列数
sz = 0;
for(int i = 0 ; i <= n ; i ++) {
U[i] = i;
D[i] = i;
L[i] = i - 1;
R[i] = i + 1;
}
L[0] = n;
R[n] = 0;
sz = n + 1;
memset(S,0,sizeof(S));
}
double dis[100][100];
int mat[100][100];
double cal(int a,int b)
{
return sqrt((city[a].x - ra[b].x)*(city[a].x - ra[b].x) + (city[a].y - ra[b].y)*(city[a].y - ra[b].y));
}
int K;
int ok(double key,int n,int m)
{
init(n);
memset(mat,0,sizeof(mat));
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(dis[i][j] <=key)
{
mat[i][j] = 1;
} //printf("%d ",mat[i][j]);
}
//puts("");
}
for(int i=1; i<=m ;i++)
{
int first = -1;
for(int j=1; j<=n; j++)
{
if(mat[j][i])
{
Insert(i,j,first);
}
}
if(first != -1)
{
R[sz-1] = first;
L[first] = sz - 1;
}
}
//min_ans = INF;
//printf("%d..\n",K);
if(dfs(0,K))
return 1;
else
return 0;
}
int main()
{
int test;
int n,m;
scanf("%d",&test);
while(test--)
{
scanf("%d%d%d",&n,&m,&K);
for(int i=1; i<=n; i++)
{
scanf("%lf%lf",&city[i].x,&city[i].y);
}
for(int i=1; i<=m; i++)
{
scanf("%lf%lf",&ra[i].x,&ra[i].y);
}
double maxr = -1;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
dis[i][j] = cal(i,j);
if(dis[i][j] > maxr)
maxr = dis[i][j];
}
}
//puts("123");
double l = 0,r = maxr;
while(r-l >=eps)
{
//printf("%.2lf %.2lf==\n",l,r);
double mid = (l + r)/2;
if(ok(mid,n,m))
r = mid;
else
l = mid;
}
printf("%.6lf\n",r);
}
}dancelinks(重复) 模板
最新推荐文章于 2026-01-06 08:34:49 发布
本文介绍了一种使用匈牙利算法解决分配问题的方法,通过定义结构体和一系列辅助函数来寻找最小费用匹配方案。该算法适用于求解一类特定的二分图最大权匹配问题,在实际应用中具有广泛的价值。
32万+

被折叠的 条评论
为什么被折叠?



