长乐集训合集

## 最小差值生成树

题目保证一定有生成树,并且图是联通的,那么我们只需要加一些限制条件枚举最小生成树即可.;

按边从小到大排序,然后从最小边开始枚举,暴力尝试添加每一条边,期望时间复杂度 O(M^2logN).

inline void kruskal(){
	sort(e+1,e+m+1);
	rep(i,1,m){
		makeset(n);//对于每条最小边都做一次最小生成树。
        int cnt=1;
		fa[e[i].u]=e[i].v;
		int maxv=e[i].w;
		rep(j,i+1,m){
			int fu=find(e[j].u),fv=find(e[j].v);
			if(fu==fv)continue;
			fa[fu]=fv;
			maxv=max(maxv,e[j].w);
			if(++cnt==n-1)break;
		}
		if(cnt==n-1)//这里一定要判一下是不是==n-1,因为可能图不连通
        	ans=min(ans,maxv-e[i].w);
	}
}
posted @ 2019-10-08 11:55  设计涉及社稷  阅读(112)  评论(0)    收藏  举报