还是最小生成树。
就是加一个状态检查,能否连接所有的点。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 100000001
using namespace std;
int a[1001];
struct lx
{
int x,y,c;
}l[5001];
int intset(int n)
{
for(int i=0; i<=n; i++)
a[i]=i;
}
int fa(int x)
{
if(x!=a[x])
x=fa(a[x]);
return a[x];
}
bool cmpa(lx t1,lx t2)
{
return t1.c<t2.c;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n)
{
for(int i=0;i<n;i++)
scanf("%d%d%d",&l[i].x,&l[i].y,&l[i].c);
int x,y;
intset(m);
sort(l,l+n,cmpa);
int ans=0;
for(int i=0;i<n;i++)
{
x=fa(l[i].x);
y=fa(l[i].y);
if(x!=y)
{
ans+=l[i].c;
a[y]=x;
}
}
int s=0;
for(int i=1;i<=m;i++)
if(a[i]==i)s++;
if(s>1)puts("?");
else
printf("%d\n",ans);
}
}