这个题今天一写就搞对了
我只能说以后一定要少看题解
要自己深入的去想
只要是把思路想明白了
代码还是容易敲出来的
此题就是最小生成树
按照先练权值最小的边的算法
当然他们不会都在一个集合内
那就用一下并查集把连好的两个点并到一个集合里
最后他们应该就都属于一个集合了
#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
struct road{
int x,y,z;
bool operator < (const road& rhs) const
{
return z < rhs.z;
}
}a[5000];
int sett[5000];
int find2(int x)
{
while( x!=sett[x] ) x=sett[x];
return x;
}
void merge2(int fx,int fy)
{
if(fx > fy ) sett[fx] =fy;
else sett[fy] = fx;
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
for(int i=0;i<(n*(n-1)/2);i++ )
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
sort(a,a+(n*(n-1)/2));
// for(int i=0;i<(n*(n-1)/2);i++ )
// printf("%d%d%d\n",a[i].x,a[i].y,a[i].z);
// set<int > s;
for(int i=1;i<=n;i++) sett[i]=i;
int cost=0;
for(int i=0;i<(n*(n-1))/2 ; i++)
{
int fx = find2(a[i].x);
int fy = find2(a[i].y);
if(fx != fy){
merge2(fx, fy);
cost += a[i].z;
}
}
printf("%d\n",cost);
}
return 0;
}