比赛 NOIP水题争霸赛 评测结果 WWWWWWWWWWWWWWWWWWWW
题目名称 最小差异值 最终得分 0
用户昵称 Dog_Two 运行时间 0.051 s
代码语言 C++ 内存使用 0.63 MiB
提交时间 2018-02-11 19:46:08
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e3,maxm=5e4;
int n,m;
int maxl,minl=INT_MAX;
struct edge{
	int u,v,w;
	bool operator < (const edge &tmp)const {
		return w<tmp.w;
	}
};
edge E[maxm+10];

int fa[maxn];
int getfa(int a){return fa[a]==a?a:fa[a]=getfa(fa[a]);}
inline bool eql(int a,int b){return getfa(a)==getfa(b);}
inline void uni(int a,int b){fa[getfa(a)]=getfa(b);}

bool kruskal(int mid){
	for(int i=1;i<=n;++i) fa[i]=i;
	int cnt=0;
	maxl=0,minl=INT_MAX;
	for(int i=1;i<=m&&cnt<n-1;++i){
		edge e=E[i];
		if(e.w<mid) continue;
		if(!eql(e.u,e.v)){
			uni(e.u,e.v);
			maxl=max(maxl,e.w);
			minl=min(minl,e.w);
			++cnt;
		}
	}	
	return cnt==n-1;
}

int main(){
	freopen("dvalue.in","r",stdin);
	freopen("dvalue.out","w",stdout);
	cin>>n>>m;
	int l=0,r=0;
	for(int i=1;i<=m;++i){
		scanf("%d%d%d",&E[i].u,&E[i].v,&E[i].w);
		r=max(r,E[i].w);
	}
	sort(E+1,E+m+1);
	while(l<r){
		cout<<l<<" "<<r<<endl;
		int mid=(l+r)>>1;
		if(kruskal(mid)) l=mid+1;
		else r=mid;
	}
	cout<<maxl-minl;
	return 0;
}