1 //裸的kruskal,如果不会的多看下并查集吧,不多说了 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 #define maxn 100 7 int fa[maxn],rank[maxn]; 8 struct node 9 { 10 int st,nd,ln; 11 }edge[maxn*maxn]; 12 int cmp(node a,node b) 13 { 14 return a.ln<b.ln; 15 } 16 void init() 17 { 18 int i; 19 for(i=0;i<maxn;i++) 20 { 21 rank[i]=1; 22 fa[i]=i; 23 } 24 } 25 int findfather(int x) 26 { 27 if(x!=fa[x]) 28 fa[x]=findfather(fa[x]); 29 return fa[x]; 30 } 31 void kruskal(int n,int m) 32 { 33 int ans,num,i,x,y; 34 ans=num=0; 35 sort(edge+1,edge+1+n,cmp); 36 for(i=1;i<=n;i++) 37 { 38 x=findfather(edge[i].st); 39 y=findfather(edge[i].nd); 40 if(x!=y) 41 { 42 ans+=edge[i].ln; 43 if(rank[x]>rank[y]) 44 { 45 fa[y]=x; 46 rank[x]+=rank[y]; 47 } 48 else 49 { 50 fa[x]=y; 51 rank[y]+=rank[x]; 52 } 53 if(++num==m-1) 54 break; 55 } 56 } 57 if(num==m-1) 58 printf("%d\n",ans); 59 else 60 printf("?\n"); 61 } 62 int main() 63 { 64 int n,m,i; 65 while(scanf("%d",&n)!=EOF) 66 { 67 init(); 68 scanf("%d",&m); 69 if(n==0) 70 break; 71 for(i=1;i<=n;i++) 72 { 73 scanf("%d%d%d",&edge[i].st,&edge[i].nd,&edge[i].ln); 74 } 75 if(n<m-1) 76 { 77 printf("?\n"); 78 continue; 79 } 80 kruskal(n,m); 81 } 82 return 0; 83 }