zoukankan      html  css  js  c++  java
  • noip模拟赛 树


    【问题描述】
    今天F大爷看到了一张n个点的无向完全图,每条边有边权。F
    大爷一开心就花0.03飞秒(即3*10-17秒)求了一下这张图的最小生
    成树以及最小生成树的个数。F大爷惊喜地发现这张图只有一个最小
    生成树,他现在更开心了,于是他把这个最小生成树告诉了你,要你
    求出原来的完全图中边权和最小是多少。
    【输入格式】
    多组数据,第一行一个正整数T,表示数据组数。
    每组数据的第一行一个正整数n,表示点数。
    接下来n-1行,每行三个正整数xi,yi,wi,表示最小生成树上xi
    yi之间有一条权值为wi的边。
    【输出格式】
    输出T行,每行一个整数,表示答案。
    【样例输入】
    2
    3
    1 2 4
    2 3 7
    4
    1 2 1
    1 3 1
    1 4 2
    【样例输出】
    19
    12
    【数据范围】
    对于20%的数据,T,n,wi<=5;
    对于另外30%的数据,n<=1000,给的树是一条链;
    对于100%的数据,T<=10,n<=20000,wi<=10000。

    【题解】

    因为最小生成树唯一,所以每一次连边连得一定是最小的。
    于是把边排序,从小到大依次加入
    并查集维护一下边所在的两个联通块的大小
    然后在每次加一条边权为wi的边的时候,因为是完全图,将两个联通块中的点两两互相连上一条边权为wi+1的边,
    因为连了一条边,两两连边数量是size[u]*size[v]-1而不是size[u]*size[v]

    【代码】

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<set>
    using namespace std;
    #define f(i,n) for(int i=1;i<=(n);i++)
    #define ll long long
    #define INF 1ll<<50
    #define N 20010
    #define c 32123
    struct xj
    {
    	int x;
    	int y;
    	ll w;
    }a[N];
    bool cmp(xj a,xj b)
    {
    	return a.w<b.w;
    }
    int fa[N];
    ll size[N];
    int find(int x)
    {
    	if(x==fa[x])return fa[x];
    	return fa[x]=find(fa[x]);
    }
    int main()
    {
    	freopen("tree.in","r",stdin);
    	freopen("tree.out","w",stdout);
    	int t,n;
    	scanf("%d",&t);
    	while(t--)
    	{
    		ll ans=0;
    		scanf("%d",&n);
    		f(i,n)
    		{
    		    fa[i]=i;
    			size[i]=1;
    		}
    		f(i,n-1)
    		{
    		    scanf("%d%d%lld",&a[i].x,&a[i].y,&a[i].w);
    			ans+=a[i].w;
    		}
    		sort(a+1,a+n,cmp);
    		f(i,n-1)
    		{
    			int u=a[i].x,v=a[i].y;
    			u=find(u);
    			v=find(v);
    			ans+=(size[u]*size[v]-1)*(a[i].w+1);
    			fa[u]=v;
    			size[v]+=size[u];
    		}
    		printf("%lld\n",ans);
    	}
    }
    
  • 相关阅读:
    python——scrapy的三种登录方式,下载中间件(Downloademiddleware),settings文件
    PHPExcel探索之旅---阶段四 导入文件
    PHPExcel探索之旅---阶段三 绘制图表
    PHPExcel探索之旅---阶段二 设置表格样式
    PHPExcel探索之旅---阶段一
    PDO中构建事务处理的应用程序
    对图片进行翻转
    用给定的角度旋转图像
    为背景图像添加图像水印(位置随机)
    对图片进行缩放
  • 原文地址:https://www.cnblogs.com/qwerfcxs/p/7802495.html
Copyright © 2011-2022 走看看