题目

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

样例输入

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

样例输出

4

样例说明

下图是样例说明。
CCF CSP 数据中心
CCF CSP 数据中心

分析

虽然题目说的很复杂,但是仔细观察样例后发现,其实就是一个最小生成树的问题,甚至都不需要考虑根节点在什么位置,因为无论在什么位置,只要把最小生成树求出来,问题就是符合题目要求的。

代码

#include <bits/stdc++.h>
using namespace std;

#define MAXN 50001

struct Edge{
	int u;
	int v;
	int w;
	Edge(int u1, int v1, int w1):u(u1), v(v1), w(w1){}
	bool operator < (const Edge & n1)const{
	    return this->w < n1.w;
	}
};

vector<Edge> v;
int pre[MAXN];

int find(int root){
	int son = 0;
	int temp = 0;
	son = root;
	while(root != pre[root]){
		root = pre[root];
	}
	while(pre[son] != root){
		temp = pre[son];
		pre[son] = root;
		son = temp;
	}
	return root;
}

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

int main(){
	int n = 0, m = 0, root = 0, u1 = 0, v1 = 0, w1 = 0, ans = 0, num = 0;
	int i = 0;
	cin >> n >> m >> root;
	for(i=0; i<m; i++){
		cin >> u1 >> v1 >> w1;
		v.push_back(Edge(u1, v1, w1));
	}
	for(i=0; i<=n; i++){
		pre[i] = i;
	}
	sort(v.begin(), v.end());
	for(vector<Edge>::iterator it = v.begin(); it != v.end(); it++){
		if(join((*it).u, (*it).v)){
			ans = (*it).w;
			if(++num == n-1){
				cout << ans;
				break;
			}
		}
	}
	return 0;
}

相关文章: