比赛 |
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;
}