首先将所有边按照修复时间进行排序,然后逐条边进行加入,当已联通时break并输出当前time值,否则输出-1
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int maxn = 1000 + 500; 6 const int maxm = 100000 + 500; 7 8 struct data{ 9 int from; 10 int to; 11 int tm; 12 }; 13 int father[maxn]; 14 int cur; 15 data p[maxm]; 16 int n, m; 17 18 bool cmp(data aa, data bb) { 19 return aa.tm < bb.tm; 20 } 21 int getfather(int x) { 22 if (father[x] == x) return (x); 23 return (father[x] = getfather(father[x])); 24 } 25 26 int main () { 27 scanf("%d %d", &n, &m); 28 cur = n; 29 for (int i = 1; i <= n; i++) father[i] = i; 30 for (int i = 1; i <= m; i++) { 31 scanf("%d %d %d", &p[i].from, &p[i].to, &p[i].tm); 32 } 33 std :: sort(p + 1, p + m + 1, cmp); 34 int j; 35 for (j = 1; j <= m; j++) { 36 int tx = getfather(p[j].from); 37 int ty = getfather(p[j].to); 38 if (tx == ty) continue; 39 father[tx] = ty; 40 cur--; 41 if (cur == 1) break; 42 } 43 if (cur == 1) printf("%d", p[j].tm); 44 else printf("-1"); 45 return 0; 46 }