#include <iostream>#include<cmath>#include<cstring>#include<cstdlib>#include<cstdio>#include<algorithm>#include<vector>#include<queue>using namespacestd;#defineINF 0XFFFFFFF#defineMAXN 103structedge{intE, W; Edge (intE=0,intw=0): E (E), W (w) {} friendBOOL operator<(Edge A, Edge B) {returnA.W <B.W; }};vector<Edge>G[MAXN];intDIST[MAXN];BOOLVIS[MAXN];intm, N;intPrime () {Edge P, Pn; intNnode =0; dist[1] =0; Priority_queue< Edge >Q; Q.push (Edge (1,0) ); while( ! Q.empty () && Nnode <N) { while( !Q.empty ()) {P=Q.top (); Q.pop (); if( !VIS[P.E]) Break; } if(VIS[P.E])Continue; Nnode++; VIS[P.E]=true; intLen =g[p.e].size (); for(intI=0; i<len; i++) {Pn=G[p.e][i]; if(!VIS[PN.E] && DIST[PN.E] >PN.W) {DIST[PN.E]=PN.W; Q.push (Pn); } } } if(Nnode <N)return-1; intsum =0; for(intI=1; i<=n; i++) {sum+=Dist[i]; } returnsum;}voidInit () { for(intI=0; i<=n; i++) {g[i].clear (); Dist[i]=INF; Vis[i]=false; }}intMain () { while(Cin >> M >>N, m) {Init (); for(intI=0; i<m; i++) { intA, B, C; CIN>> a >> b >>C; G[a].push_back (Edge (b,c)); G[b].push_back (Edge (a,c)); } intAns =Prime (); if(ans = =-1) cout<<"?"<<Endl; Elsecout<< ans <<Endl; } return 0;}
Prime adjacency table + priority queue