注意事项:
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; }