程序设计思维与实践 Week6 作业 D - 数据中心

本文深入解析了如何通过Kruskal算法求解图的最小生成树,并找出其中的最小最长边。文章首先指出了理解题目的难点在于从复杂的公式中提炼出核心思想,即求解最小生成树的最长边。随后,详细介绍了使用Kruskal算法的具体步骤,包括构建优先级队列、查找集合并进行合并等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在这里插入图片描述在这里插入图片描述

思路

这一题其实我觉得难的不是做题思路,而是读懂题目意思…题目楞是将求图的最小最长边繁化成了一堆公式,当你从那些公式里面读懂这个意思的时候其实就差不多做出来了。根据瓶颈生成树的性质,最小生成树一定是瓶颈生成树,因此最小生成树的最长边一定就是该树的最小最长边。所以只需套用Kruskal直接求最小生成树并输出最大边即可。

代码

#include <stdio.h>
#include <queue>
using namespace std;
struct edge
{
	int dot1;
	int dot2;
	int weight;
	bool operator <(const edge &e) const
	{
		return  weight>e.weight;
	}
};
struct set
{
	int num;
	int parent;
};
int count1[50010];
set s[50010];
int find(int n)
{
	int p=n;
	if(s[n].parent!=s[n].num)
	{
		while(s[p].parent!=s[p].num)
			p=s[p].parent;
		s[n].parent=p;
	}
	return p;
}

void unite(int m,int n)
{
	int a=find(m);int b=find(n);
	if(a==b)
		return;
	if(count1[a]<count1[b])
	{
		int tmp;
		tmp=a;
		a=b;
		b=tmp;
	}
	s[b].parent=a;
	count1[a]=count1[a]+count1[b];
}
int main()
{
	int n,m,root;
	scanf("%d %d %d",&n,&m,&root);
	for(int i=0;i<=n;i++)
	{
		s[i].num=i;s[i].parent=i;
	}
	priority_queue<edge> pile;
	for(int i=0;i<m;i++)
	{
		int v,u,w;
		scanf("%d %d %d",&v,&u,&w);
		edge temp;
		temp.dot1=v;temp.dot2=u;temp.weight=w;
		pile.push(temp);
	}
	int count=0;
	int max=0;
	while(count<n-1&&!pile.empty())
	{
		edge tmp=pile.top();
		pile.pop();
		if(find(tmp.dot1)!=find(tmp.dot2))
		{
			unite(tmp.dot1,tmp.dot2);
			if(tmp.weight>max)
				max=tmp.weight;
			count++;
		}
	}
	printf("%d",max);
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值