C language source code: [cpp] # include <stdio. h> # include <stdlib. h> # define maxsize 110 typedef struct edge {int a, B; int weight;} edge; edge E [maxsize]; int T [maxsize]; int findroot (int x) {int temp; if (T [x] =-1) return x; else {temp = findroot (T [x]); T [x] = temp; return temp;} int cmp (const void * a, const void * B) {edge * aa = (edge *) a; edge * bb = (edge *) B; return aa-> weight-bb-> weight;} int main () {int n, m, weight, I, num, roota, rootb; scanf ("% d", & n, & m); while (n) {for (I = 0; I <n; I ++) scanf ("% d", & E [I]. a, & E [I]. b, & E [I]. weight); qsort (E, n, sizeof (E [0]), cmp); for (I = 1; I <= m; I ++) T [I] =-1; weight = 0; num = 0; for (I = 0; I <n; I ++) {roota = findroot (E [I]. a); rootb = findroot (E [I]. b); if (roota! = Rootb) {T [rootb] = roota; weight + = E [I]. weight ;}}for (I = 1; I <= m; I ++) if (T [I] =-1) num ++; if (num> 1) printf ("? \ N "); else printf (" % d \ n ", weight); scanf (" % d ", & n, & m );}}