网易笔试8.8(生成树最大权值与最小权值之差最小)

#include <bits/stdc++.h>

using namespace std;

struct Edge{
	int u, v;
	int w;
};

bool inSameSet(int *uni, int r1, int r2) {
	while(r1 != uni[r1]) r1 = uni[r1];
	while(r2 != uni[r2]) r2 = uni[r2];
	
	if(r1 == r2) return true;
	uni[r1] = r2;
	return false;
}

int solution() {
	int n, m;
	cin >> n >> m;
	
	//顶点为1时,边数自然为0 
	if(n == 1) 
		return 0;	
	
	int uni[n+1];
	for(int i = 1; i<=n; ++i) uni[i] = i;
	
	Edge edge[m];
	for(int i = 0; i<m; ++i) {
		cin >> edge[i].u >> edge[i].v >> edge[i].w; 
	}
	
	sort(edge, edge+m, [](Edge& a, Edge& b) {
		return a.w < b.w;
	});
	
	int l, r, dw = n-2, min_d = INT_MAX;
	for(int i = dw; i<m; ++i) {
		if(edge[i].w - edge[i-dw].w < min_d) {
			r = i;
			min_d = edge[i].w - edge[i-dw].w;
		}
	}
	
	l = r-dw;
	
	//先加l, l+1, ..., r这n-1条边,看是否构成树
	int cnt = 0;	//加入的边数 
	for(int i = l; i<=r; ++i) {
		if(!inSameSet(uni, edge[i].u, edge[i].v)) {
			++cnt;
		}
	}	
	
	//若边数cnt小于n-1则还得往两边去找边加入到集合中,直到找到n-1条边 
	while(l >= 0 && r<n && cnt < n-1) {
		if(l == 0) {
			++r;
			if(r<n && !inSameSet(uni, edge[r].u, edge[r].v)) {
				++cnt;
			}
		} else if(r == n-1) {
			--l;
			if(l>=0 && !inSameSet(uni, edge[l].u, edge[l].v)) {
				++cnt;
			}
		} else {
			
			if(edge[r].w - edge[l-1].w < edge[r+1].w -edge[l].w) {
				--l;
				if(!inSameSet(uni, edge[l].u, edge[l].v)) ++cnt;
			} else{
				++r;
				if(!inSameSet(uni, edge[r].u, edge[r].v)) ++cnt;
			}
		}
	}
	
	return edge[r].w - edge[l].w;
}

int main()
{
	cout << solution() << endl;
	return 0;
 } 

题目描述:有一张n个顶点m条边的无向图,每条边一个权值。
牛牛希望构造一棵生成树(既保留n-1条边,单保持图连通),使得最大边权减去最小边权的值最小。

输入:2 1
1 2 100
输出: 0
解释:第一行为该图顶点数为n = 2,边数 m = 1,后面的m行为边的信息,1 2 100 表示边(1, 2)的权值为100
#笔试题目##网易#
全部评论
最小生成树的最大边权和最小边权的差是固定的吗
点赞 回复 分享
发布于 2020-08-12 12:02

相关推荐

07-28 16:15
门头沟学院 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
小浪_Coding:找硬件测试,也可兼顾软测欧, 简历还可以的 ,注意排版,项目写的有条理一点, 然后个人技能多加点, 润色好简历之后就开始沟通海投了,深圳,东莞这边做硬件相关的公司还不少, 医疗类,仪器类的都可以尝试
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务