题目:
内心静不下来,题就做不出来。
刚打完从点开始的最小树,看到这个点一下子蒙了。
哦,是从边出发,每次选最小的边,如果已经连通,那么下一个,嗯,就是最小生成树的算法,
只是终止条件发生了变化,连通度,很容易转变,起初连通度为点数,加入一条边连通度减少1.
代码:
#include<bits/stdc++.h>
using namespace std;
int m,n,k;
int fa[5005];
struct edge{
int start,end;
long long len;
} v[200005];
bool cmp(edge a,edge b)
{
return a.len<b.len;
}
int find(int x)
{
if(fa[x]==x) return x;
fa[x]=find(fa[x]);
return fa[x];
}
int main()
{
cin>>m>>n>>k;
if(m<k) {
cout<<"No Answer";return 0;
}
if(m==k) {
cout<<"0";return 0;
}
for(int i=0;i<n;i++)
{
int a,b,c;
cin>>a>>b>>c;
v[i].start=a;
v[i].end=b;
v[i].len=c;
}
sort(v,v+n,cmp);
for(int i=1;i<=m;i++) fa[i]=i;
int num=m;
int ans=0;
for(int i=0;i<n;i++)
{
if(find(v[i].start)==find(v[i].end))
{
continue;
}
num--;
fa[find(v[i].start)]=find(v[i].end);
ans+=v[i].len;
if(num==k) break;
}
cout<<ans;
}
直接改的,ac了,那为什么模板没有???更加懵逼