题目链接。
#include <stdio.h> #include <stdlib.h> #define MAXN 5000 int v[MAXN], u[MAXN], p[101], w[MAXN], r[MAXN]; int find(int x){return p[x] == x ? x : (p[x] = find(p[x]));} int comp(const void *a, const void *b){ int x = *(int *)a, y = *(int *)b; return w[x] - w[y]; } int main(){ int n, m, i, s, icount; while(scanf("%d", &n) == 1 && n != 0){ icount = 0; s = 0; scanf("%d", &m); for(i=0; i<n; i++) scanf("%d %d %d", &v[i], &u[i], &w[i]); for(i=1; i<=m; i++) p[i] = i; for(i=0; i<n; i++) r[i] = i; qsort(r, n, sizeof(r[0]), comp); for(i=0; i<n; i++){ int e = r[i], x = find(v[e]), y = find(u[e]); if(x != y){ s += w[e]; p[x] = y; icount++; } } if(icount < m-1) printf("?\n"); else printf("%d\n", s); } return 0; }