题目
试题编号: 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
样例说明
下图是样例说明。
分析
虽然题目说的很复杂,但是仔细观察样例后发现,其实就是一个最小生成树的问题,甚至都不需要考虑根节点在什么位置,因为无论在什么位置,只要把最小生成树求出来,问题就是符合题目要求的。
代码
#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;
}