图论之构造完全图

题目 2398:

信息学奥赛一本通T1489-构造完全图

时间限制: 2s 内存限制: 192MB 提交: 16 解决: 9

题目描述

对于完全图 G,若有且仅有一棵最小生成树为 T,则称完全图 G 是树 T 扩展出的。

给你一棵树 T,找出 T 能扩展出的边权和最小的完全图 G。

输入格式

第一行 N 表示树 T 的点数;

接下来 N−1 行三个整数 Si,Ti,Di ;描述一条边(Si,Ti)权值为 Di ;

保证输入数据构成一棵树。

输出格式

输出仅一个数,表示最小的完全图 G 的边权和。

样例输入

复制

复制代码
4  
1 2 1  
1 3 1  
1 4 2

样例输出

复制

复制代码
12

提示

样例说明

添加 D(2,3)=2,D(3,4)=3,D(2,4)=3 即可。

数据范围:

对于 20% 的数据,N≤10;

对于 50% 的数据,N≤1000;

对于 100% 的数据,N≤105,1≤Di≤105 。
思路:

类似于kruskal建树过程,先找到最小树边,再在此基础上加边,使其成为一个局部完全图。依次进行,最后就得到一个最小权完全图。注意加边时边权应该为最小树边权加1,否则就不满足最小生成树的唯一性。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int p[N];
int cnt[N];
long long ans;
struct edge{
    int a,b,w;
    bool operator<(edge&W){
        return w<W.w;
    }
}e[N];
int t;
int find(int x){
    if(x!=p[x]){
        p[x]=find(p[x]);
    }
    return p[x];
}
int main()
{
    cin>>t;
    for(int i=1;i<=t;i++){
        p[i]=i;
        cnt[i]=1;
    }
    for(int i=1;i<t;i++){
        int a,b,c;
        cin>>a>>b>>c;
        e[i].a=a,e[i].b=b,e[i].w=c;
    }
    sort(e+1,e+t);
    for(int i=1;i<t;i++){
        int a=e[i].a;
        int b=e[i].b;
        int c=e[i].w;
        int x=find(a);
        int y=find(b);
        if(x!=y){
            p[x]=y;
            ans+=(long long)(cnt[x]*cnt[y]-1)*(c+1);
            cnt[y]=cnt[x]+cnt[y];
            ans+=c;
        }
    }
    cout<<ans;
}
相关推荐
j_xxx404_36 分钟前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺40 分钟前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
THMAIL1 小时前
深度学习从入门到精通 - 神经网络核心原理:从生物神经元到数学模型蜕变
人工智能·python·深度学习·神经网络·算法·机器学习·逻辑回归
野犬寒鸦1 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
墨染点香1 小时前
LeetCode 刷题【61. 旋转链表】
算法·leetcode·职场和发展
一枝小雨2 小时前
【OJ】C++ vector类OJ题
数据结构·c++·算法·leetcode·oj题
Tisfy2 小时前
LeetCode 3516.找到最近的人:计算绝对值大小
数学·算法·leetcode·题解
自信的小螺丝钉2 小时前
Leetcode 206. 反转链表 迭代/递归
算法·leetcode·链表
黑色的山岗在沉睡2 小时前
LeetCode 189. 轮转数组
java·算法·leetcode
墨染点香2 小时前
LeetCode 刷题【65. 有效数字】
算法·leetcode·职场和发展