week6作业——D:数据中心

一道CSP的考题:201812-4
正如学长所说,CSP的题目确实很绕,不过仔细分析题目、读出他的考察点才是解题的关键

主要思路:

“每个节点需要选择一条路劲将数据发送到root节点”、“最优的树结构传输图”、“完成任务所需时间最少”、“root只接收数据,其他节点可以接受多个节点的数据,只能传输给一个节点”
结合题目中的表述以及样例,我们需要求出所有生成树中这样的一棵,其最大边权尽可能小,即求出最小瓶颈树的最大边权,而MST正是一棵最小瓶颈树,于是问题转化为求最小生成树的最大边
与C题类似,再进行kruskal时我们只需记录最大边的信息即可

D - 数据中心
在这里插入图片描述在这里插入图片描述

Sample Input

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

Sample Output

4

A Possible Solution

#include<stdio.h>
#include<algorithm>
using namespace std;

struct Edge{
	int u,v,w;
	
	bool operator < (const Edge& e) const {
		return w<e.w;
	}
};


int n,m,root,size=0;
int par[50005];
Edge edge[100005];

int Find(int target){
	if(target==par[target])
		return target;
	return par[target]=Find(par[target]);
}

bool Union(int x,int y){
	x=Find(x);
	y=Find(y);
	if(x==y)
		return false;
	else{
		par[x]=y;
		return true;
	}
}

int main(){
	scanf("%d %d %d",&n,&m,&root);
	for(;size<m;size++){
		scanf("%d %d %d",&(edge[size].u),&(edge[size].v),&(edge[size].w));
	}
	for(int i=1;i<=n;i++)
		par[i]=i;
		
	sort(edge,edge+size);
	
	int ans=0,cnt=0;
	for(int i=0;i<size;i++){
		if(Union(edge[i].u,edge[i].v)){
			if(ans<edge[i].w)
				ans=edge[i].w;
			cnt++;
		}
		if(cnt==n-1){
			printf("%d\n",ans);
			break;
		}
	}
//		printf("{%d, %d, %d}\n",edge[i].u,edge[i].v,edge[i].w);

	
	return 0;
} 
发布了26 篇原创文章 · 获赞 0 · 访问量 484

猜你喜欢

转载自blog.csdn.net/weixin_43669888/article/details/105266396