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

同CSP 2018 12-4

题目描述:

思路:

首先给的输入数据构成了一张图,但是思考题目中的句子:“root节点只能接收数据,其余任何一个节点可以将数据传输给另外的一个节点,但是不能将数据传输给多个节点”。可以看出,只能传给一个节点,抽象为只有一个父节点,这符合树结构的定义。root即为树结构的根节点。因此最终的输出结构为一个树,这棵树还包含了原图中所有的点,因此是一棵生成树。既然是一棵生成树,现在的思路在逐渐向着最小生成树靠近,考虑最小生成树的性质,最小生成树一定是一棵瓶颈生成树,同时也恰好满足本题的题意:认为所有的数据是同时传输的,即树中最大的边权值就是传输所需要的时间。所以问题转换为:输出最小生成树中的最大边。

瓶颈生成树的定义:对于无向图G,G的瓶颈生成树是一棵 “ 树上最大边权值 edge 在G的所有生成树中最小 ” 的生成树,这样的生成树可能不止一棵。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxx=100010;
int n,m,root,tot,ans=-0x7f,father[maxx];
struct node
{
	int u;
	int v;
	int w;
	bool operator <(const node&o)const
	{
		return w<o.w;
	}
}e[maxx];
int find(int x)
{
	if(x!=father[x])
	father[x]=find(father[x]);
	return father[x];
}
void unionn(int a,int b)
{
	int fa=find(a);
	int fb=find(b);
	father[fa]=fb;
}
int main()
{
	cin>>n>>m>>root;
	for(int i=1;i<=m;i++)
	cin>>e[i].u>>e[i].v>>e[i].w;
	for(int i=1;i<=n;i++)
	father[i]=i;
	sort(e+1,e+m+1);
	for(int i=1;i<=m;i++)
	{
		if(find(e[i].u)!=find(e[i].v))
		{
			unionn(e[i].u,e[i].v);
			ans=max(ans,e[i].w);
			tot++;
		}
		if(tot==n-1)
		break; 
	}
	cout<<ans;
	return 0;
}
发布了277 篇原创文章 · 获赞 222 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/cax1165/article/details/105107321
今日推荐