- Make It Connected
- 题意 :给定 n给点生成一棵树,发费 任意两点可以建边 ,花费为 a [ i ]+ a [ j ] ,还有给定的一些边,都可以使用。
- 思路 第一种建边方式必然是选择 都插在 a[ id ]最小的点上。 所以直接建立 n-1条 与 最小的 id 相连的边即可。然后在
- 现在所有的边上跑一边 最小生成树即可。
-
#include<bits/stdc++.h> using namespace std; #define inf 0x7f7f7f7f #define ll long long #define maxn 432110 int n,m,fa[maxn],id; ll a[maxn],ans,ss; struct node { int x,y; ll w; bool operator<(const node &b)const { return w<b.w; } } b[maxn]; int fond(int x) { return x==fa[x]?x:fa[x]=fond(fa[x]); } int main() { ss=1e18; scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { scanf("%lld",&a[i]); if(a[i]<ss)ss=a[i],id=i; fa[i]=i; } for(int i=0; i<m; i++) scanf("%d%d%lld",&b[i].x,&b[i].y,&b[i].w); for(int i=1; i<=n; i++) if(i!=id)b[m++]=(node){i,id,a[i]+a[id]}; sort(b,b+m); for(int i=0; i<m; i++) { int tx=fond(b[i].x); int ty=fond(b[i].y); if(tx==ty)continue; fa[tx]=ty; ans+=b[i].w; } printf("%lld\n",ans); return 0; }
Make It Connected-生成树
最新推荐文章于 2022-11-21 14:03:40 发布