D - 数据中心
题目描述
Example
Input
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
Output
4
NOTE
解题思路
该题也要求最小生成树,要求输出答案为最小生成树中的最大边,与C题一样使用Kruscal算法。复杂度为O(n)。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#define maxn 100100
using namespace std;
struct edge {
int u,v,w;
bool operator< (const edge &p) {
return w<p.w;
}
}Edges[maxn];
int tot=0;
void addEdge(int u,int v,int w) {
tot++;
Edges[tot].u=u;
Edges[tot].v=v;
Edges[tot].w=w;
}
int par[maxn];
int N,M,root,ans=0;
int find(int x) {
return par[x]=(x==par[x]? x:find(par[x]));
}
void kruscal() {
int cnt=1;
for(int i=1;i<=tot;i++) {
int set1=find(Edges[i].u),
set2=find(Edges[i].v);
if(set1==set2) continue;
else {
ans=max(ans,Edges[i].w);
par[find(Edges[i].v)]=find(Edges[i].u);
cnt++;
}
if(cnt==N) break;
}
}
int main() {
scanf("%d%d%d",&N,&M,&root);
for(int i=0;i<=N;i++) par[i]=i;
for(int i=1;i<=M;i++) {
int u_,v_,w_;
scanf("%d%d%d",&u_,&v_,&w_);
addEdge(u_,v_,w_);
}
sort(Edges+1,Edges+tot+1);
kruscal();
printf("%d\n",ans);
return 0;
}