关键在于并查集的使用
#include<cstdio> #include<vector> #include<algorithm> using namespace std; const int maxn = 100; struct edge { int front,end; int value; bool operator < (edge B) { if(value < B.value) { return true; } else { return false; } } }E[maxn]; int p[maxn]; int find(int x) { if(p[x] == x) return x; else { p[x] = find(p[x]); return p[x]; } } //vector<edge>E; int main() { freopen("input.txt","r",stdin); int num_V,num_E; scanf("%d%d",&num_V,&num_E); for(int i = 0;i < num_E;i++) { scanf("%d%d%d",&E[i].front,&E[i].end,&E[i].value); } sort(E,E + num_E); for(int i = 1;i <= num_V;i++) { p[i] = i;//初始化并查集 } int ans = 0; for(int i = 0;i < num_E;i++) { int p1 = find(E[i].front); int p2 = find(E[i].end); if(p1 != p2) { ans = ans + E[i].value; p[p1] = p2; } } return 0; }