Codeforces Round 891 (Div. 3) G题 Counting Graphs(最小生成树,快速幂维护加权方案数)

embedded/2024/12/23 6:07:25/

题目链接

https://codeforces.com/problemset/problem/1857/G

思路

考虑将给出的树的边按照权值从小到大排序,并模拟最小生成树的过程。

因为 k r u s k a l kruskal kruskal算法在每次合并两个连通块的过程中,会浪费掉两个连通块大小乘积 − 1 -1 1条边。

被浪费掉的边,可以选择的权值为 s − 当前枚举的这条边的权值 + 1 s-当前枚举的这条边的权值+1 s当前枚举的这条边的权值+1。(因为有不选的情况,所以要 + 1 +1 +1)。

最后,用快速幂维护枚举每条边时可行方案数的乘积即可。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long i64;
const int N = 2e5 + 5, mod = 998244353;int n, s;
struct Edge
{int u, v, w;bool operator<(const Edge &x){return w < x.w;}
};
int qmi(int a, int b, int c)
{int res = 1;while (b){if (b & 1) res = res * a % c;b >>= 1;a = a * a % c;}return res;
}
struct DSU
{std::vector<int> f, siz;DSU() {}DSU(int n){init(n);}void init(int n){f.resize(n);std::iota(f.begin(), f.end(), 0);siz.assign(n, 1);}int find(int x){while (x != f[x]){x = f[x] = f[f[x]];}return x;}bool same(int x, int y){return find(x) == find(y);}bool merge(int x, int y){x = find(x);y = find(y);if (x == y){return false;}siz[x] += siz[y];f[y] = x;return true;}int size(int x){return siz[find(x)];}
};
void solve()
{cin >> n >> s;vector<Edge> edge;for (int i = 1, u, v, w; i < n; i++){cin >> u >> v >> w;edge.push_back({u, v, w});}DSU dsu(n + 1);sort(edge.begin(), edge.end());int ans = 1;for (int i = 0; i < edge.size(); i++){int fx = dsu.find(edge[i].u);int fy = dsu.find(edge[i].v);int w = edge[i].w;ans = ans * qmi(s - w + 1, dsu.siz[fx] * dsu.siz[fy] - 1, mod) % mod;dsu.merge(fx, fy);}cout << ans << endl;
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int test = 1;cin >> test;for (int i = 1; i <= test; i++){solve();}return 0;
}

http://www.ppmy.cn/embedded/115732.html

相关文章

python画图1

import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] ["SimHei"]# 模拟数据 years [2016, 2017, 2018, 2019, 2020, 2021, 2022] market_size [7950, 8931, 9940, 11205, 12305, 13199, 14980] my_color #3e9df5plt.plot(years, market_s…

算力风暴(Computational Power Surge)

算力风暴&#xff08;Computational Power Surge&#xff09; 算力风暴&#xff08;Computational Power Surge&#xff09; 1. 算力风暴的定义与驱动因素 2. 关键技术驱动算力提升 3. 算力风暴带来的挑战 4. 应对算力风暴的策略 5. 算力风暴的未来展望 6. 算力风暴对产…

蓝桥杯嵌入式客观题合集

十四届模拟赛二客观题 解析&#xff1a;STM32微控制器的I/O端口寄存器必须按32位字被访问 解析&#xff1a;微分电路能将三角波转换为方波&#xff1b;积分电路能将方波转换为三角波 解析&#xff1a;放大电路的本质是能量的控制与转换 解析&#xff1a;具有n个节点&#xff0c…

【C高级】有关shell脚本的一些练习

目录 1、写一个shell脚本&#xff0c;将以下内容放到脚本中&#xff1a; 2、写一个脚本&#xff0c;包含以下内容&#xff1a; 1、写一个shell脚本&#xff0c;将以下内容放到脚本中&#xff1a; 1、在家目录下创建目录文件&#xff0c;dir 2、dir下创建dir1和dir2 …

Vuex 入门与实战

引言 Vuex 是 Vue.js 官方推荐的状态管理库&#xff0c;它可以帮助我们更好地管理 Vue 应用的状态。在大型应用中&#xff0c;组件之间的状态共享和通信是一个非常重要的问题&#xff0c;而 Vuex 提供了一种优雅的解决方案。 在 Vue 应用中&#xff0c;数据的流动一般是单向的…

广度优先搜索算法及其matlab程序详解

#################本文为学习《图论算法及其MATLAB实现》的学习笔记################# 算法用途 广度优先搜索算法的应用 算法思想 广度优先搜索算法的步骤: ①,标号,令。 ②当所有标号为 的、与顶点 相关联的边的端点都已标号时,则停止;否则,把与 相关联的边的未标号的…

数据库简介

各位同学大家好&#xff0c;本次课程我们就来了解数据库的相关知识&#xff0c;数据库顾名思义就是用来保存数据的&#xff0c;像是淘宝&#xff0c;美团&#xff0c;滴滴都有大量的数据需要保存&#xff0c;如果做一个横向对比&#xff0c;是程序重要还是数据库重要&#xff1…

【Docker】安装及使用

1. 安装Docker Desktop Docker Desktop是官方提供的桌面版Docker客户端&#xff0c;在Mac上使用Docker需要安装这个工具。 访问 Docker官方页面 并下载Docker Desktop for Mac。打开下载的.dmg文件&#xff0c;并拖动Docker图标到应用程序文件夹。安装完成后&#xff0c;打开…