解题报告:应该把要选的都给选上,然后在从小到大选边。
#include<bits/stdc++.h>
const int N=31000;
using namespace std;
struct node{
int p;
int a;
int b;
int c;
}q[N];
int p[N];
int find(int x)
{
if(x!=p[x])
p[x]=find(p[x]);
return p[x];
}
bool cmp(node a,node b)
{
if(a.p!=b.p)
return a.p<b.p;
return a.c<b.c;
}
int main()
{
int n;
int m;
cin>>n>>m;
int cnt=0;
for(int i=1;i<=n;i++)
p[i]=i;
while(m--)
{
int a,b,c;
int p;
cin>>p;
cin>>a>>b>>c;
q[cnt++]={p,a,b,c};
}
sort(q,q+cnt,cmp);
long long res=0;
// cout<<cnt<<endl;
for(int i=0;i<cnt;i++)
{
int a=find(q[i].a),b=find(q[i].b),c=q[i].c,pp=q[i].p;
if(pp==1)
{
p[a]=b;
res = res + c;
continue;
}
if(a!=b)
{
p[a]=b;
res =res + c;
}
}
cout<<res<<endl;
return 0;
}