【算法】走廊泼水节(最小生成树,完全图)

news/2024/7/15 18:58:40 标签: 算法, c++, 图论, Kruskal, 最小生成树

题目

给定一棵 N 个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树。

求增加的边的权值总和最小是多少。

注意: 树中的所有边权均为整数,且新加的所有边权也必须为整数。

输入格式

第一行包含整数 t,表示共有 t 组测试数据。

对于每组测试数据,第一行包含整数 N。

接下来 N−1 行,每行三个整数 X,Y,Z,表示 X 节点与 Y 节点之间存在一条边,长度为 Z。

输出格式

每组数据输出一个整数,表示权值总和最小值。

每个结果占一行。

数据范围

1≤N≤6000
1≤Z≤100

输入样例:

2
3
1 2 2
1 3 3
4
1 2 3
2 3 4
3 4 5 

输出样例:

4
17 

思路

从小到大依次遍历所有树边,若遍历到连接团N与团M的树边长为w,需要添加(N * M)- 1条长为w + 1的边使连接之后的团成为完全图。如下图所示:

关键代码如下:

代码 

#include<bits/stdc++.h>
using namespace std;
const int N = 6e3 + 10;
typedef pair<int,pair<int,int>> PII;
int n;

int p[N];
int cnt[N];

int find(int x)
{
    if(p[x] != x) p[x] = find(p[x]);
    return p[x];
}

void solve()
{
    cin >> n;
    for(int i = 1; i <= n; i ++) p[i] = i,cnt[i] = 1;
    priority_queue<PII,vector<PII>,greater<>> heap;
    
    for(int i = 1; i < n; i ++)
    {
        int x,y,dist;
        cin >> x >> y >> dist;
        heap.push({dist,{x,y}});
    }
    int ans = 0;
    while(!heap.empty())
    {
        auto t = heap.top();
        heap.pop();
        int x = find(t.second.first);
        int y = find(t.second.second);
        int dist = t.first;
        ans += (dist + 1) * (cnt[x] * cnt[y] - 1);
        p[x] = y;
        cnt[y] += cnt[x];
    }
    cout << ans << endl;
}

int main()
{
    int t;
    cin >> t;
    while(t --)
        solve();
    return 0;
}
难度:中等
时/空限制:1s / 64MB
总通过数:6735
总尝试数:10984
来源:《算法竞赛进阶指南》
算法标签

图论     ​​​​​​最小生成树     Kruskal

题目来自:346. 走廊泼水节 - AcWing题库


http://www.niftyadmin.cn/n/5354485.html

相关文章

Python 因果推断(上)

引言 原文&#xff1a;causal-methods.github.io/Book/Introduction.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Vitor Kamada 电子邮件&#xff1a;econometrics.methodsgmail.com 最后更新日期&#xff1a;2020 年 8 月 15 日 这本书是使…

2024年美赛美国大学生数学建模竞赛E题思路解析+代码+论文

下文包含&#xff1a;2024年美国大学生数学建模竞赛&#xff08;美赛&#xff09;A- F题思路解析、选题建议、代码可视化及如何准备数学建模竞赛&#xff08;2号发&#xff09; C君将会第一时间发布选题建议、所有题目的思路解析、相关代码、参考文献、参考论文等多项资料&…

第九节HarmonyOS 常用基础组件14-DataPanel

1、描述 数据面板组件&#xff0c;用于将多个数据占比情况使用占比图进行展示。 2、接口 DataPanel(options:{values: number[], max?: numner, type?: DataPanelType}) 3、参数 参数名 参数类型 必填 描述 values number[] 是 数据值列表&#xff0c;最多含9条数…

离线安装nginx_银河麒麟系统_nginx报错_503_500 Internal Server Error----nginx工作笔记007

如果报这个错误,意思就是,对于nginx.conf文件中指定的,文件夹没有权限 那么这个是去给对应的文件夹赋权限: chmod 777 /opt/module/test_web 就可以了,然后再去访问就不会报错了,还有 503的错误都可以这样解决 然后关于离线安装nginx,尝试了一下如果把之前安装过的nginx,直接…

【美团】1688事业部-高级开发工程师JAVA-杭州

所属部门: 淘天集团 | 学历: 本科 | 工作年限: 1 年 职位描述 参与建设基于产业带LBS物理信息实时数据的全新B类专业导购模式&#xff0c;建设1688的产业地图导购中心化场景&#xff0c;为线上下做融合提供交互技术窗口&#xff1b;主导构建商家可提报和小二可运营的榜单技术支…

基于Springboot的视频网站系统的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的视频网站系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

认知篇:什么是CoT(思维链)? 也许GPT需要你引导

本系列文章主要是分享一些关于大模型的一些学术研究或者实验性质的探索&#xff0c;为大家更新一些针对大模型的认知。所有的结论我都会附上对应的参考文献&#xff0c;有理有据&#xff0c;也希望这些内容可以对大家使用大模型的过程有一些启发。 注&#xff1a;本系列研究关注…

每日一道编程题:查找元素位置

题目 给定一个按照升序排列的有序数组和一个目标值&#xff0c;查找出这个目标值在有序数组中的第一个位置和最后一个位置。如果在数组中不存在目标值&#xff0c;则输出[-1,-1]。 输入格式 第一行有两个整数&#xff0c;第一个为目标值整数x&#xff0c;第二个为数组的长度…