木+拡散を最小全域を考える(ロス・バレーP1661)

スプレッド

タイトル説明

図に示すように、点毎時間単位は、4つの方向の距離を拡散します。

闘莉王

二点、E(A、B)と呼ばれるB通信、場合にのみ拡散領域であれば、Bが一般的です。通信ブロックの定義はブロックU内の任意の2点であり、Vパスが失敗E(U、A0)、Eなしで存在する (A0、A1)、···、E(AK、V)。入力フォーマット所与の
数N、n行、各ラインの点座標の最初の行。

入力形式

[データ]スケール

データの20%を、ミート1≤N≤5に、1≤X[I]、Y [i]は≤50。

データ満たす1≤N≤50の100%、1≤X[I]、Y [i]が≤10^ 9。

出力フォーマット

全ての通信ブロックの最も早い時点を表す数値が形成されています。

出力平面上の点へのN個の入力サンプルは、それらが通信ブロックを形成することが最も早い時間であるものを尋ねました。


最初の二つハーマンデイトン通信2つのブロックに最小の時間を知っていなければならない最も重要である距離、である;
最も長い辺は、最小のn個の点は、スパニングツリー、次に必要とされます。

コード:

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100100;
const int M=2000100;
const int mod=1e9;
int head[N],cnt,n,x[100],y[100],fa[100];
struct Node{
	int fa,sn,w;
}edge[N*2];
void add(int p,int q,int w){
	edge[cnt].fa=p;
	edge[cnt].sn=q;
	edge[cnt].w=w;
	cnt++;
}
bool cmp(Node p,Node q){return p.w<q.w;}
int find(int p){
	if(p==fa[p]) return p;
	return fa[p]=find(fa[p]);
}
int krus(){
	sort(edge,edge+cnt,cmp);
	int tot=0,ans=0;
	for(int i=0;i<cnt;i++){
		if(find(edge[i].fa)!=find(edge[i].sn)){
			tot++;
			fa[find(edge[i].sn)]=find(edge[i].fa);
			ans=max(edge[i].w,ans);
		}		
		if(tot==n-1) break;
	}
	return ans;
}
int main(){
	memset(head,-1,sizeof(head));
	cin>>n;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			int d=abs(x[j]-x[i])+abs(y[j]-y[i]);
			d=(d+1)/2;
			add(i,j,d),add(j,i,d);
		}
	}
	cout<<krus()<<endl;
	return 0;
}
公開された264元の記事 ウォン称賛46 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_44291254/article/details/105331718