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;
}

 

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