問題描述
試題編號: | 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;
}