洛谷:P1195 口袋的天空(图,最小生成树,普及- )

题目:

在这里插入图片描述

内心静不下来,题就做不出来。

刚打完从点开始的最小树,看到这个点一下子蒙了。

哦,是从边出发,每次选最小的边,如果已经连通,那么下一个,嗯,就是最小生成树的算法,

只是终止条件发生了变化,连通度,很容易转变,起初连通度为点数,加入一条边连通度减少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<<endl;
 }
 cout<<ans;
}

直接改的,ac了,那为什么模板没有???更加懵逼

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/108446425
今日推荐