#include <iostream>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
int n,m;
struct Edge {
int from,to,weight;
Edge(int _from,int _to,int _weight):from(_from),to(_to),weight(_weight) {}
bool operator<(const Edge &p)const {
return weight>p.weight;
}
};
priority_queue<Edge> edges;
vector<int> father;
int Find(int x) {
if(father[x]==-1)
return x;
return father[x]=Find(father[x]);
}
bool Union(int x,int y) {
int rootx=Find(x);
int rooty=Find(y);
if(rootx==rooty)
return false;
else
father[rootx]=rooty;
return true;
}
int Krusral() {
int ans=0;
int cnt=0;
while(cnt<n-1) {
if(edges.empty())
return -1;
Edge edge=edges.top();
if(Union(edge.from,edge.to)) {
cnt++;
ans+=edge.weight;
}
edges.pop();
}
return ans;
}
int main() {
cin>>n>>m;
father.resize(n,-1);
int from,to,weight;
for(int i=0; i<m; i++) {
cin>>from>>to>>weight;
edges.push(Edge(from,to,weight));
}
cout<<Krusral()<<endl;
return 0;
}
01-30
836
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交