首页 > 小红的图上加边
头像 AliLexiWalker
发表于 2026-04-10 00:06:43
先把原图里本来就连在一起的点分成几团,每一团只记住团内最大的点权。 接下来要把这些团连成一个大团,最省钱的做法就是让最大点权那一团当中心,把其他团一个个接过来。这样总花费就是所有团最大点权加起来,再减去最大的那个。 void solve(){ int n,m;cin>>n> 展开全文
头像 飞鸢泛惊鸿
发表于 2026-04-10 14:42:47
题目理解有一张无向图,共有 n 个点,每个点有一个权值 aᵢ。图中已经有 m 条边,我们要通过加边把它变成连通图。每次加边的代价是:这条边连接的两个连通块合并后,新的连通块中最大的节点权值。问:连通整个图的最小总代价是多少?思路分析假设我们一开始有 k 个连通块。每个连通块都有一个“代表值”,就是这 展开全文
头像 此在Dasein
发表于 2026-04-10 03:32:01
一、 问题分析 1. 问题抽象 本问题的本质是在一个给定的森林(由多个连通分量组成的无向图)中添加边,使得所有节点最终处于同一个连通分量内。 节点与边:节点数为 ,已有边数为 。 初始状态:给定边已经将图划分为 个连通分量。 操作代价:每添加一条连接两个不同连通分量 和 的边,代价为 。即合 展开全文
头像 牛客69596014号
发表于 2026-04-10 10:13:15
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class Main { static class Dsu{ 展开全文
头像 腌萝卜干
发表于 2026-04-10 12:21:19
简单贪心策略 为了使更大的权值被加的次数尽可能的少, 每个连通块按照最大值从小到大排序, 除了第一个剩余累加起来就是最小代价 #include <bits/stdc++.h> #define x first #define y second #define all(x) x.begin 展开全文
头像 牛客305305017号
发表于 2026-04-10 14:29:28
#include<bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; void solve() { int n, m; cin >> n >& 展开全文
头像 IA3000
发表于 2026-04-10 23:29:59
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; vector<int> e[N]; int n, m; int a[N]; bool vis[N]; int mx; int mn; lo 展开全文
头像 牛客356037512号
发表于 2026-04-11 15:43:47
import java.util.*; public class Main { static ArrayList<Integer>[] adj; static int[] a; static int m,n; static boolean[] visi 展开全文
头像 为芙宁娜献出心脏
发表于 2026-04-10 15:05:00
这道题其实就是很典的连边变成一个连通块的变体 首先他说要我们连边连成一个连通块,我们很容易就能想到用并查集的方式。 然后他又说每次连边的代价是最新形成的连通块的最大元素值,那我们就能想到:那我就需要维护每次连边的时候联通的这两个连通块的最大值,这里可以发现并查集是可以做的 然后就是他已经连了m条变了 展开全文
头像 chenlan114
发表于 2026-04-10 15:46:59
#include<bits/stdc++.h> using namespace std; using ll = long long; const ll N = 1e5 + 5; struct UF { ll rank = 0; UF* root; ll w; 展开全文

等你来战

查看全部