最小生成树P.S.S在宿命的指引下找到了巫师Kismi。P.S.S希望Kismi能帮自己变成一个完全图。Kismi由于某些不可告人的原因,把这件事交给了你。 PS: 可以保证,这个最小生成树对于最后求出的完全图是唯一的。
标签:卡尔 pre std clu class 输出 节点 bsp 正整数
转载一下YH大佬的blog地址http://blog.csdn.net/jokercold
。。
直译小丑严寒2333
以及HK大佬
http://blog.csdn.net/yuyaohekai
宿命的PSS
最小生成树P.S.S在宿命的指引下找到了巫师Kismi。P.S.S希望Kismi能帮自己变成一个完全图。Kismi由于某些不可告人的原因,把这件事交给了你。 PS: 可以保证,这个最小生成树对于最后求出的完全图是唯一的。
输入的第一行是一个整数n,表示生成树的节点数。 接下来有n-1行,每行有三个正整数,依次表示每条边的端点编号和边权。 (顶点的边号在1-n之间,边权< maxint)
一个整数ans,表示以该树为最小生成树的最小完全图的边权之和。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n,m,f[20010]; long long number[20010]; struct node { int u,v; long long z; }a[20010]; bool cmp(node a,node b) { if (a.z<b.z) return true; return false; } int get(int x) { if (f[x]==x) return x;else f[x]=get(f[x]); return f[x]; } int main() { scanf("%d",&n); long long ans=0; for (int i=1;i<=n-1;i++) { scanf("%d%d%lld",&a[i].u,&a[i].v,&a[i].z); ans+=a[i].z; } sort(a+1,a+n,cmp); for (int i=1;i<=n;i++) f[i]=i,number[i]=1; for (int i=1;i<=n-1;i++) { if (get(a[i].u)!=get(a[i].v)) { long long num=number[get(a[i].u)]; ans+=(a[i].z+1)*(number[get(a[i].u)]*number[get(a[i].v)]-1); f[get(a[i].u)]=get(a[i].v); number[get(a[i].v)]+=num; } } printf("%lld\n",ans); return 0; }
标签:卡尔 pre std clu class 输出 节点 bsp 正整数
原文地址:http://www.cnblogs.com/dancer16/p/6946863.html