http://acm.hdu.edu.cn/showproblem.php?pid=1863
#include<stdio.h>
#include<string.h>
#define MAX 0x3f3f3f
#define N 110
int graph[N][N],visited[N],ps[N];
int a[N];
int find(int k)
{
int r=k;
while(a[r]!=r)
r=a[r];
int x=k,tem;
while(x!=r)
{
tem=a[x];
a[x]=r;
x=tem;
}
return r;
}
int cmp(int m)
{
int i,j;
int min,pos,sum=0;
memset(visited,0,sizeof(visited));
pos=1;
visited[1]=1;
for(i=2;i<=m;i++)
ps[i]=graph[pos][i];
for(i=1;i<m;i++)
{
min=MAX;
for(j=1;j<=m;j++)
{
if(!visited[j]&&ps[j]<min)
{
min=ps[j];
pos=j;
}
}
sum+=min;
visited[pos]=1;
for(j=2;j<=m;j++)
{
if(!visited[j]&&graph[pos][j]<ps[j])
ps[j]=graph[pos][j];
}
}
printf("%d\n",sum);
return 0;
}
int main()
{
int n,m,i,j,t1,t2,x,y;
int s,money;
while(scanf("%d%d",&n,&m),n)
{
s=0;
memset(graph,MAX,sizeof(graph));
for(i=1;i<=m;i++)
a[i]=i;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&money);
graph[x][y]=graph[y][x]=money;
t1=find(x);
t2=find(y);
if(t1!=t2)
a[t1]=t2;
}
for(i=1;i<=m;i++)
if(a[i]==i)
s++;
if(s>=2)
{
printf("?\n");
continue;
}
cmp(m);
}
return 0;
}