Object Clustering POJ - 3241 曼哈顿最小生成树

题目链接:https://cn.vjudge.net/problem/POJ-3241

题意:n个点,按照曼哈顿距离,形成k个集合后,使得每个集合任意两点的距离小于等于x,求最小的x

题解:也就是最小生成树中,第n-k小的边。 曼哈顿最小生成树思路讲解:点击查看

#include
#include
#include
#include
using namespace std;
#define INF 0x3f3f3f3f
#define lowbit(x) x&(-x)
const int N=10010;
struct Point{
	int x,y;
	int y_x;
	int id;
	bool operator <(const Point &xx)const
	{
		if(x!=xx.x) return x=1;j--)
			{
				pos=lower_bound(b+1,b+1+len,p[j].y_x)-b;
				cnt=query(pos);
				if(cnt!=-1) addedge(p[j].id,p[cnt].id,dis(p[j],p[cnt]));
				update(pos,p[j].x+p[j].y,j);
			}
		}
		sort(e+1,e+1+tot);
		cnt=0;
		k=n-k;
		for(int i=1;i<=tot;i++)
		{
			x=fath(e[i].u);
			y=fath(e[i].v);
			if(x==y) continue;
			f[x]=y;
			cnt++;
			if(cnt==k)
			{
				printf("%d\n",e[i].d);
				break;
			}
		}
	
	return 0;
} 

 

你可能感兴趣的:(曼哈顿距离MST,生成树)