CCF2018-12-4 数据中心

问题描述

试题编号: 201812-4
试题名称: 数据中心
时间限制: 1.0s
内存限制: 512.0MB
问题描述:


样例输入

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

样例输出

4

样例说明

  下图是样例说明。

 

思路: 根据题目描述,所求为此图的最小生成树中的最大边权值。 采用Kruskal算法计算最小生成树,最小生成树生成后只需输出最后一个加入的边的权重即可。

#include<iostream>
#include<algorithm>
#include<memory.h>
using namespace std;

const int M=100005; //边数
const int N=50005; //点数 

//并查集 
int pre[N];
void init( int n ){
	for(int i=1;i<=n;i++)
		pre[i]=i;
} 

int find(int x){
	int r=x;
	while(r!=pre[r]){
		r=pre[r];
	}
	while(x!=pre[x]){
		int i=pre[x];
		pre[x]=r;
		x=i;
	}
	return r;
}

bool join(int x,int y){
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy){
		pre[fx]=fy;
		return true;
	}
	return false;
}

struct Edge{
	int u,v,w;
	bool operator < (const Edge &a)const{
		return w<a.w;
	}
}a[M];


int main(){
	int n,m,root;
	cin>>n>>m>>root;
	for(int i=1;i<=m;i++)
		cin>>a[i].u>>a[i].v>>a[i].w;
	sort(&a[1],&a[1]+m);
	init(n);
	int cnt=0,i;  //cnt用于记录加入的边数
	for(i=1;i<=m;i++){
		if(join(a[i].u,a[i].v)){
			cnt++;
		}
		if(cnt == n-1) break;  //最小生成树中 边数 比 点数 少 1 
	}
	cout<<a[i].w;
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章