比赛 NOIP水题争霸赛 评测结果 WAWWWAAWWAWWWWAAAAAW
题目名称 最小差异值 最终得分 45
用户昵称 FYJ 运行时间 1.319 s
代码语言 C++ 内存使用 0.36 MiB
提交时间 2018-02-11 21:42:57
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
template <class X> inline void read(X &x){
	char c=getchar();x=0;X flag=1;
	while(c<'0'||c>'9'){if(c=='-')flag=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();}
	x*=flag;
}
int head[5000+5],cnt,fa[5000+5],ans=100000000,n,m;
//bool f=0;
struct node{
	int v,u,w,nxt,nu;
}e[5000+5];
inline void add(int v,int u,int w){
	e[++cnt].v=v;
	e[cnt].u=u;
	e[cnt].w=w;
	e[cnt].nu=cnt;
	e[cnt].nxt=head[v];
	head[v]=cnt;
}
inline bool cmp(node a,node b){
	return a.w<b.w;
}
inline int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
inline void dfs(int x){
	int sum=0,minn,maxx;
	for(int i=x;i<=cnt;++i){
		if(e[i].w-minn>ans)return ;
//		if(i==cnt)f=1;
		if(sum==n-1)break;
		int a=find(e[i].v),b=find(e[i].u);
		if(a!=b){
			fa[b]=fa[a];
			sum++;
			if(sum==1)minn=e[i].w;
			if(sum==n-1)maxx=e[i].w;
		}
	}
	if(sum==n-1)ans=min(ans,maxx-minn);
	return ;
}
int main(){
	freopen("dvalue.in","r",stdin);
	freopen("dvalue.out","w",stdout);
	read(n);read(m);
	
	for(int i=1;i<=m;++i){
		int a,b,c;
		read(a);read(b);read(c);
		add(a,b,c);
	}
	sort(e+1,e+1+cnt,cmp);
	for(int i=1;i<=cnt-n;++i){
		for(int j=1;j<=n;++j)fa[j]=j;
		dfs(i);
//		if(f)break;
	}
//	for(int i=1;i<=cnt;++i){
//		printf("num:%d :%d %d %d\n",e[i].nu,e[i].v,e[i].u,e[i].w);
//	}
	printf("%d",ans);
	return 0;
}