题目链接:逐个击破
分析
反过来想,要把k个城市连成多个并查集,每个并查集只能有一个城市,怎样花费最多。
排序+贪心做法
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int n,k,fa[100005],b[1000005];
ll ans;
struct lwx
{
int u,v,w;
}a[500001];
bool cmp(lwx x,lwx y)
{
return x.w>y.w;
}
//int father(int x)
//{
// if(fa[x]==x) return x;
// else return fa[x]=father(fa[x]);
//}
int father(int x){return x==fa[x]?x:fa[x]=father(fa[x]);}
int main()
{
int m;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
for(int i=1;i<=k;i++)
{
int x;
cin>>x;
b[x+1]=1;
}
for(int i=1;i<=m;i++)
{
cin>>a[i].u>>a[i].v>>a[i].w;
a[i].u++;
a[i].v++;
ans+=a[i].w;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
{
int fu=father(a[i].u),fv=father(a[i].v);
if(fu==fv) ans-=a[i].w;
else if(!b[fu]||!b[fv])
{
ans-=a[i].w;
if(b[fu]) fa[fv]=fu;
else fa[fu]=fv;
}
}
cout<<ans;
return 0;
}