题意是问最多有多少个灯能在任意两个间距不少于1.3m的情况下被安置
那么很明显矛盾所在是两盏灯距离小于1.3m时只能选择其中一盏
那么就好办了,将有矛盾的建双向图
然后求最大独立集就是最大的安置灯数了
另外注意一点是这个题卡匈牙利算法的邻接矩阵方法
邻接矩阵时间复杂度n的立方,所以这题会超时
改成邻接表,时间复杂度是nm,就能AC了
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
using namespace std;
const int N=2000+3;
int n,x,y,sum;
vector<int> Mao[N];
int match[N],vis[N];
struct P
{
int x,y;
}p[N];
bool DFS(int x)
{
for(int i=0;i<Mao[x].size();i++)
{
int y=Mao[x][i];
if(!vis[y])
{
vis[y]=1;
if(DFS(match[y]) || match[y]==0)
{
match[y]=x;
return true ;
}
}
}
return false ;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(match,0,sizeof(match));
sum=0;
for(int i=1;i<=n;i++)
{
Mao[i].clear();
scanf("%d%d",&p[i].x,&p[i].y);
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
double dis=sqrt(1.0*(p[i].x-p[j].x)*(p[i].x-p[j].x)+1.0*(p[i].y-p[j].y)*(p[i].y-p[j].y));
if(dis<1.3)
{
Mao[i].push_back(j);
Mao[j].push_back(i);
}
}
}
for(int x=1;x<=n;x++)
{
memset(vis,0,sizeof(vis));
if(DFS(x)) sum++;
}
printf("%d\n",n-sum/2);
}
return 0;
}