week-6-D-数据中心(最小瓶颈生成树)

题意

在这里插入图片描述

	  样例:
	  INPUT:
	  4
	  5
	  1
      1 2 3
	  1 3 4
      1 4 5
      2 3 8
      3 4 2
      OUTPUT:
      4

思路

  • 此题本意是求 最优的max{Th},就是求最优max{t11,t12,t13,t21,t22,t23,t31},也就是求解一棵生成树,使其最大边权最小;
  •  如何知道求生成树:题目中声明多个结点传输一个结点,但是一个结点不能传输多个结点;
    
  • 那么就转化为求最小生成树中最大边权即可;
  • 然后就是输入edge边集,然后排序,通过并查集进行合并即可,然后用max记录最大边权;

总结

  • 此处应用并查集应该使用路径压缩的树并查集,如果使用数组描述的并查集会导致超时;
  • 其次由于数据范围很大,使用scanf进行输入,节省输入时间;

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct nums
{
	int v1;//标号
	int v2;
	int edge;//消耗
	bool operator<(const nums& p)
	{
		return edge < p.edge;
	}
	nums& operator=(const nums& p)
	{
		v1 = p.v1;
		v2 = p.v2;
		edge = p.edge;
		return *this;
	}
};
int n, m,root,count1 = 0, max1=0;
int a[500010];
void init()//并查集的初始化
{
	for (int i = 1; i < n + 3; i++)
		a[i] = i;
}
int find(int x)//并查集的查询
{
	if(a[x]==x)
		return x;
	return a[x]=find(a[x]);
}
bool  unite(int x, int y)
{
	x=find(x);
	y=find(y);
	if(x==y)
		return false;
	a[x]=y;
	return true;

}
void max_w(struct nums* edge1)
{
	sort(edge1, edge1 + count1);
	init();
	int c = 0;
	for (int i = 0; i < count1; i++)
	{
		struct nums temp = edge1[i];
		if (unite(edge1[i].v1,edge1[i].v2))
		{
			
			if (edge1[i].edge > max1)
				max1 = edge1[i].edge;
			c++;
		}
		if (c == n)
			break;
	}

}
int main()
{
	cin >> n;
	cin >> m;
	cin >> root;
	struct nums edge1[1000000];
	for (int i = 0; i < m; i++)
	{
		int v1, v2, edge;
		scanf("%d%d%d", &v1, &v2, &edge);
		edge1[count1].v1 = v1;
		edge1[count1].v2 = v2;
		edge1[count1].edge = edge;
		count1++;
	}
	max_w(edge1);
	cout << max1 << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值