1. 程式人生 > >CF1095F Make It Connected

CF1095F Make It Connected

++i turn 一個 tdi connected 菊花 span != ret

如果沒有額外邊,最小生成樹就是一個以最小權值的點為根的菊花

然後把這些邊拿出來和額外邊跑一邊最小生成樹就可以了

#include<bits/stdc++.h>
const int maxn = 200100;
typedef long long ll;
int n,m,tot,fa[maxn];
ll a[maxn],ans;
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
struct E{
    int x,y;
    ll v;
    inline int operator < (const E&b)const
{return v < b.v;} }e[maxn<<1]; int main(){ std::ios::sync_with_stdio(false),std::cin.tie(0); std::cin >> n >> m; int p=0;a[p]=1e18; for(int i=1;i<=n;++i){ std::cin >> a[i]; if(a[i]<a[p])p=i; fa[i]=i; } for(int i=1;i<=n;++i)if
(i!=p)e[++tot]={i,p,a[i]+a[p]}; ll v; for(int i=1,x,y;i<=m;++i)std::cin >> x >> y >> v,e[++tot]={x,y,v}; std::sort(e+1,e+tot+1); for(int i=1;i<=tot;++i) if(find(e[i].x)!=find(e[i].y)) ans+=e[i].v,fa[find(e[i].x)]=find(e[i].y); std::cout
<< ans << \n; }

CF1095F Make It Connected