CF1095F Make It Connected
阿新 • • 發佈:2019-01-31
++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