kattis Programming Tutors 给游客与导游匹配(二分+二分图)

题目来源:https://vjudge.net/problem/Kattis-programmingtutors

题意:

有n个游客,n个导游,给出他们的坐标,问你怎么匹配可以使他们最大距离最小

题解:

用一个lim变量表示最远可以连接的距离,用二分图匹配,如果可以匹配则这个lim一定符合条件,用二分寻找最小的lim

好题

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=100+5;
struct Node
{
	int x,y;
}st[maxn],tu[maxn];
int n,match[maxn];
long long  lim;
bool used[maxn];

inline int dis(Node a,Node b)
{
	return abs(a.x-b.x)+abs(a.y-b.y);
}
int dfs(int x)
{


	for(int i=1;i<=n;i++)
	{
		if(used[i]==0&&dis(st[x],tu[i])<=lim)
		{
			used[i]=1;
			if(match[i]==0||dfs(match[i]))
			{
				match[i]=x;
				return 1;
			}
		}
	}
	return 0;

}
bool guar()
{
	memset(match,0,sizeof(match));
	for(int i=1;i<=n;i++)
	{
		memset(used,0,sizeof(used));
		if(dfs(i)==0)return 0;
	}
    return 1;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d %d",&st[i].x,&st[i].y);
	for(int i=1;i<=n;i++)
		scanf("%d %d",&tu[i].x,&tu[i].y);
    long long a=0,b=1e10;
	while(a!=b)
	{
		long long mid=(a+b)/2;
		lim=mid;
		if(guar())
            b=mid;
		else 
			a=mid+1;
	}
	printf("%lld
",a);
	return 0;
}

  

原文地址:https://www.cnblogs.com/carcar/p/9092418.html