问题描述
试题编号: | 201812-4 |
试题名称: | 数据中心 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: |
样例输入 4 样例输出 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;
}