赞
踩
我们知道 K r u s k a l Kruskal Kruskal 每次是对两个集合进行操作,也就是一个集合中的点不可能与另
一个集合相连。也就是为了构成完全图我们必须知道这两个集合中的大小,然后我
们一一连边根据乘法原理也就是 s i z e [ a ] ∗ s i z e [ b ] − 1 size[a]*size[b]-1 size[a]∗size[b]−1
但是需要连一条大小多少的边呢?因为 k r u s k a l kruskal kruskal是排序过的,所以为了保证最小生树
的唯一性和不变性,我们需要令加的边为当前的 w + 1 w+1 w+1即可
int n,m,t; int p[N],size1[N]; struct node{ int a,b;double w; bool operator<(const node &W)const{ return w<W.w; } }e[N*N]; void init() { for(int i=1;i<=N;i++) { p[i] = i; size1[i]=1; } } int find(int x) { if(x!=p[x])return p[x] =find(p[x]); return p[x]; } void solve() { cin>>n; init(); for(int i=1;i<n;i++) { int a,b;double c; cin>>a>>b>>c; e[i] = {a,b,c}; } sort(e+1,e+n); ll ans = 0; for(int i=1;i<n;i++) { int a = e[i].a,b = e[i].b,w=e[i].w; a = find(a),b=find(b); if(a == b)continue; ans+=1ll*(size1[a]*size1[b]-1)*(w+1); p[a] =b; size1[b] +=size1[a]; } cout<<ans<<endl; }
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。