注意事项:
1.用到结构体进行比较,在比较过程中for循环是以输入的道路条数为界限。
2.使用并查集的时候,一定要注意m,n的使用,该用m就用m,该用n就用n。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int m,n;
int pre[105];
struct sss
{
int l;
int r;
int j;
}a[10005];
bool cmp (sss x,sss y)
{
return x.j < y.j;
}
int find (int x)
{
if(pre[x]==x) return x;
else return pre[x]=find(pre[x]);
}
int main()
{
while (cin >> m >> n)
{
if(m==0) break;
for (int i=1;i<=n;i++)
{
pre[i]=i;
}
for (int i=1;i<=m;i++)
{
cin >> a[i].l >> a[i].r >> a[i].j;
}
sort (a+1,a+1+m,cmp);
int sum=0;
for (int i=1;i<=m;i++)
{
int ll=find(a[i].l);
int rr=find(a[i].r);
if(ll!=rr)
{
pre[ll]=rr;
sum+=a[i].j;
}
}
int num=0;
for (int i=1;i<=n;i++)
{
if(pre[i]==i)num++;
}
if(num!=1)cout << "?" << endl;
else cout << sum << endl;
}
return 0;
}


京公网安备 11010502036488号