题目链接:CH6201

当时在海亮考试的第一题;

心得:其实一个算法是要真正理解这个思路和过程,而并不是单单知道它是用来写什么题的;

思路:n个节点有n-1条边,把这n-1条边按照权值从小到大排序,有点类似Kruskal算法的过程;

设当前扫描到边(x,y,z)时,若x,y不在同一个集合,此时应该合并Sx,Sy,此时,对于x所在集合中除x之外的点u,y所在集合中除y之外的点v,完全图中u与v之间肯定要连一条边,所以共同构成一个环,因为要保证边(x,y)一定在最小生成树中,就必须让(x,y)是连接两个集合的边权最小的边。设x,y之间权值为z,所以(u,v)的边权最小为z+1。而Sx与Sy之间最后一共会增加(size[x]*size[y]-1)条边,所以把(z+1)*(size[x]*size[y]-1)累加到答案中;

算法时间复杂度O(NlogN);

#include<bits/stdc++.h>
using namespace std;
#define N 500001
template<typename T>inline void read(T &x)
{
x=;T f=,ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-; ch=getchar();}
while(isdigit(ch)) {x=x*+ch-''; ch=getchar();}
x*=f;
}
struct gg
{
int x,y,v;
}a[N<<];
int father[N],size[N],t,n;
bool cmp(gg x,gg y){return x.v<y.v;}
inline int find(int x){return father[x]==x?x:father[x]=find(father[x]);}
int main() {
read(t);
while(t--) {
read(n);
for(int i=;i<=n;i++) father[i]=i,size[i]=;
for(int i=;i<n;i++)
read(a[i].x),read(a[i].y),read(a[i].v);
sort(a,a+n,cmp);
long long ans=;
for(int i=;i<n;i++) {
int p=find(a[i].x),q=find(a[i].y);
if(p==q) continue;
ans+=(long long)(a[i].v+)*(size[p]*size[q]-);
father[p]=q;
size[q]+=size[p];
}
printf("%lld\n",ans);
}
return ;
}

CH 6201 走廊泼水节题解的更多相关文章

  1. CH 6021 走廊泼水节

    描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 我们一共有N个OIER打算参加这个泼水节,同时 ...

  2. contesthunter 6201 走廊泼水节【克鲁斯卡尔+并查集】

    很有意思的题,所以还是截lyddalao的课件 #include<iostream> #include<cstdio> #include<algorithm> us ...

  3. AcWing 走廊泼水节 题解

    这道题大致题意就是让一棵树任意两点有连边(也就是完全图),但是补完后最小生成树是一开始的那棵树,问最小加的边权之和是多少. 了解题意后,我们可以想到用Kruskal(废话),当每两个集合合并的时候,除 ...

  4. CH6201 走廊泼水节【最小生成树】

    6201 走廊泼水节 0x60「图论」例题 描述 [简化版题意]给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 我 ...

  5. [Tvvj1391]走廊泼水节(最小生成树)

    [Tvvj1391]走廊泼水节 Description 给定一棵N个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树.求增加的边的权值总和最小是多少. 完全图:完 ...

  6. 「CH6201」走廊泼水节

    「CH6201」走廊泼水节 传送门 考虑 \(\text{Kruskal}\) 的过程以及用到一个最小生成树的性质即可. 在联通两个联通块时,我们肯定会选择最小的一条边来连接这两个联通块,那么这两个联 ...

  7. Joy OI【走廊泼水节】题解--最小生成树推论变式

    题目链接: http://joyoi.org/problem/tyvj-1391 思路: 首先这需要一个推论: "给定一张无向图,若用\(k(k<n-1)\)条边构成一个生成森林(可以 ...

  8. [TYVJ1391]走廊泼水节

    Description 话说,中中带领的OIER们打算举行一次冬季泼水节,当然这是要秘密进行的,绝对不可以让中中知道.不过中中可是老江湖了,当然很快就发现了我们的小阴谋,于是他准备好水枪迫不及待的想要 ...

  9. P1391 走廊泼水节

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景  话说,中中带领的OIER们打算举行一次冬季泼水节,当然这是要秘密进行的,绝对不可以让中中知道.不过中中可是老 ...

随机推荐

  1. PL-SVO公式推导及代码解析:地图点重投影和特征对齐

    对当前帧进行地图点重投影和特征对齐 // map reprojection & feature alignment SVO_START_TIMER("reproject") ...

  2. 简单数据库开发之dao层开发

    数据库 dao层是用来与底层数据库连接的一系列代码,它因上层service层调用而调用底层数据库,因为一般的数据库不会只存在一到几张表格,所以必须定义出dao层的接口协议,方便各种表格的操作. dao ...

  3. ALM 中查看某个 test 的更改 history 历史

    ALM 中要查看某个 test 更改历史, 需要下面两个表: AUDIT_LOG and AUDIT_PROPERTIES ------- Get Test modification history ...

  4. Babylon.js demo

    demo地址   访问demo  全屏试试  感觉很棒 在线文档  搜索:Default rendering pipeline demo源码在线调试地址

  5. spark-sql jdbc操作mysql

    SparkConf sparkConf = new SparkConf() .setMaster("local") .setAppName("MySqlTest" ...

  6. Numpy增加一列,指定概率指定参数

    这里主要应用到numpy.random.choice 可以根据需求,比如增加一列,A B C 为该列数据,随机概率生成 详见代码 import numpy as np import pandas as ...

  7. jquery和js 判断下拉框选项选中值

    js <script> var selectId = document.getElementById("VariantType");//获取ID selectId.on ...

  8. java 各种数据类型的互相转换

    StringBuilder转化为String StringBuilder stb = new StringBuilder(); String str=stb.toString(); //方法1 Str ...

  9. FPGA验证之SystemVerilog+UVM

    [转载]https://blog.csdn.net/lijiuyangzilsc/article/details/50879545     数字芯片和FPGA的验证.主要是其中的功能仿真和时序仿真. ...

  10. dataTable使用方法

    using System; using System.Data; using System.Data.SqlClient; namespace App{ class MyClass{ public s ...