Slim Span(最小生成树+枚举)

题意:

求生成树最长边与最短边的最小差值

思路:

代码:

const int maxn=1e4+100;

struct node{
	int u,v,w;
}edge[maxn];
int root[maxn],n,m;

bool cmp(node a,node b){
	return a.w<b.w;
}

int Find(int x){
	if(x!=root[x]) root[x]=Find(root[x]);
	return root[x];
}

void init(int n){
	for(int i=1;i<=n;i++) root[i]=i;
}

void solve(){
    while(~scanf("%d%d",&n,&m)){
    	if(!n&&!m) break;
    	init(n);
    	for(int i=1;i<=m;i++){
    		edge[i].u=read,edge[i].v=read,edge[i].w=read;
		}
		sort(edge+1,edge+1+m,cmp);
		int res=inf;
		for(int l=1,r=1;l<=m;l++){
			bool flag=0;
			int cnt=0;
			init(n);
			for(int k=l;k<=m;k++){
				int u=edge[k].u,v=edge[k].v;
				int fu=Find(u),fv=Find(v);
				if(fu!=fv){
					root[fu]=fv;
					cnt++;
				}
				if(cnt==n-1){
					flag=1;r=k;break;
				}
			}
			if(flag){
				res=min(res,edge[r].w-edge[l].w);
				//cout<<l<<" "<<r<<"***********"<<res<<endl;
				r=l;
			}
			
		}
		if(res==inf) puts("-1");
		else cout<<res<<endl;
	}
}

posted @ 2021-05-23 21:32  OvO1  阅读(42)  评论(0编辑  收藏  举报