本来以为是最短路问题,做了好久,转换思路到幷查集。比原来多了最优方案选择的问题,只需要进行排序,然后进行正常幷查集操作即可,不用担心重复问题,因为幷查集不会出现这个问题,自动去重。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define Max int(1e5+10)
int fa[110],n,m;
typedef struct e
{
int where,to,cost;
};
bool cmp(e x,e y)
{
return x.cost<y.cost;
}
e g[Max];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main()
{
while(~scanf("%d%d%",&n,&m)&&n)
{
for(int i=1;i<=m;i++)
fa[i]=i;
for(int i=0;i<n;i++)
scanf("%d%d%d",&g[i].where,&g[i].to,&g[i].cost);
sort(g,g+n,cmp);
int sum=0;
for(int i=0;i<n;i++)
{
int x= find(g[i].where),y=find(g[i].to);
if(x!=y)
{
fa[x]=y;
sum+=g[i].cost;
}
}
int count =0;
for(int i=1;i<=m;i++)
if(fa[i]==i)
count++;
if(count==1)
printf("%d\n",sum);
else
printf("?\n");
}
return 0;
}