Week6:数据中心——并查集

**题目描述**在这里插入图片描述
输入案例

4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2

输出格式

4

思路分析
其实这道题要求的答案,就是对给出的图,求出其所有可能的生成树里,最大的边权最小的那棵生成树,然后输出它的那个最大的边权。
我们知道,最小生成树一定是瓶颈生成树,那么直接求最小生成树即可——并查集。
题目给出的root变量毫无卵用 #(滑稽)。

那怎么求出我们想要的最小生成树呢?对所有的边初始化排序,按照权值由小到大,然后执行并查集操作,每次都记下当前的max权值,把所有的边跑完并查集之后,答案就出来了。

//这真的是CSP的题目嘛

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;

const int MAX=500001;
int n,m,root;
int father[MAX];

struct Node
{
	int u,v,w;
	bool operator<(const Node &W) const
    {
        return w < W.w;
    }
}node[MAX];

int findfather(int x)
{
	return father[x] == x ? x : father[x] = findfather(father[x]);
}

int kruskal()
{
	int res=0;
	for(int i=1;i<=n;i++)
		father[i]=i;
	sort(node,node+m);

	for(int i=0;i<m;i++)//认爹
	{
		int a=node[i].u;
		int b=node[i].v;
  		int faA=findfather(a);
  		int faB=findfather(b);
		if(faA!=faB)
		{
			father[faA]=faB;
			res=max(res,node[i].w);
		}
    }
    
    return res;
}


int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m>>root;
	for(int i=0;i<m;i++)
	{
		cin>>node[i].u>>node[i].v>>node[i].w;
	}

	cout<<kruskal();
	
	return 0;
}
原创文章 52 获赞 7 访问量 1688

猜你喜欢

转载自blog.csdn.net/qq_44506233/article/details/105283090