给n个点的坐标(二维) 求任意两点之间的距离大于 1.3 的点的最大个数
最大独立集
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define Maxn 21001
using namespace std;
struct Edge
{
int to;
int next;
} edge[Maxn];
int head[Maxn], tot;
void init()
{
tot = 0;
memset(head, -1, sizeof(head));
}
void addedge(int u, int v)
{
edge[tot].to = v;
edge[tot].next = head[u];
head[u] = tot++;
}
struct node
{
int x;
int y;
} po[Maxn];
int linker[Maxn];
bool used[Maxn];
int uN;
bool dfs(int u)
{
for(int i = head[u]; i != -1; i = edge[i].next)
{
int v = edge[i].to;
if(!used[v])
{
used[v] = true;
if(linker[v] == -1 || dfs(linker[v]))
{
linker[v] = u;
return true;
}
}
}
return false;
}
int hungary()
{
int res = 0;
memset(linker, -1, sizeof(linker));
for(int u = 0; u < uN; u++)
{
memset(used, false, sizeof(used));
if(dfs(u))res++;
}
return res;
}
double dis(node x, node y)
{
return sqrt((x.x - y.x) * (x.x - y.x) + (x.y - y.y) * (x.y - y.y));
}
int main()
{
while(scanf("%d", &uN) == 1)
{
init();
for(int i = 0; i <uN; i++)
{
scanf("%d %d", &po[i].x, &po[i].y);
}
for(int i = 0; i < uN; i++)
{
for(int j = i + 1; j < uN; j++)
{
if(dis(po[i], po[j]) < 1.3)
{
addedge(i, j);
addedge(j, i);
}
}
}
int sum1 = hungary();
printf("%d\n", uN - sum1 / 2);
}
return 0;
}