Week6 D - 数据中心
Example
Input
4
5
1
1 2 3
1 3 4
1 4 5
2 3 8
3 4 2
Output
4
Note
解题思路
求最小生成树
题目要求的起始点并没有意义 因为最小生成树必经过每一点
所以可以直接复制上一题的代码
Code
#include<iostream>
#include<iostream>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m,root;
int s[100001];
int rs[100001];
int t=1;
int ans=0;
void init(int x){
for(int i=0;i<x;i++){
s[i]=i;rs[i]=1;
}
}
int find(int x){
if(s[x]==x) return x;
return find(s[x]);
}
bool unite(int x,int y){
x=find(x);y=find(y);
if(x==y)return false;
if(rs[x]>rs[y]){s[y]=x;rs[x]=(rs[y]+=rs[x]);
}else{s[x]=y;rs[y]=(rs[x]+=rs[y]);
}
return true;
}
struct Edge{
int a;
int b;
int v=-1;
}edge[100001];
void kruskal(){
int k=0;
for(int i=0;i<t+1;i++){
if(unite(edge[i].a,edge[i].b)){
k++;
if(edge[i].v>ans)ans=edge[i].v;
}
if(k==n-1)return;
}
}
bool cmp(Edge a,Edge b){
return a.v<b.v;
}
int main(){
cin>>n;
init(n);
cin>>m;
cin>>root;
int v,u,ti;
for(int i=1;i<=m;i++){
cin>>v>>u>>ti;
edge[i].a=v;
edge[i].b=u;
edge[i].v=ti;
t=i;
}
t++;
sort(edge+1,edge+t+1,cmp);
kruskal();
cout<<ans<<endl;
}