CF1857G Counting Graphs 题解
题目描述
给定一棵最小生成树,求有多少张图的最小生成树是给定的树,并且这张图的所有边边权不超过 \(S\)。
思路
考虑在最小生成树中加边。
我们回顾一下 Kruskal 的过程:
- 找到没被用过的,最小的边
- 判断这条边的两端是否在一个联通块中
- 加入这条边,将两端的联通块连在一起
根据第三条,我们可以得出一个结论:只要在加边时,保证加入的边是给定的边,这张图的最小生成树就一定是给定的树。

因此,在这两个联通块之间加任意一条大于给定边的边,最小生成树肯定不变。

设联通块 \(1\) 有 \(a\) 个元素,联通块 \(2\) 有 \(b\) 个元素,给定边长度为 \(w\),那么两个联通块中的点对就有 \(a\times b -1\) 对(最小生成树里的那对不算),每对点对有不连边、连一条权值为 \(w+1\) 的边、连一条权值为 \(w+1\) 的边 . . . 连一条权值为 \(S\) 的边,一共 \(S-w+1\) 种连法,\(ans=ans\times (S-w+1)^{a+b-1}\)。
跑一遍最小生成树,维护每个联通块的 \(size\) ,再统计答案即可。
没注释的 Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct Edge{
int u,v,w;
}E[200005];
int T,N,S,X,Y,Z;
int ans;
int Power(int base,int power){
int res=1;
while(power){
if(power&1) res=(res*base)%998244353;
base=(base*base)%998244353;
power>>=1;
}return res;
}
int fa[200005],sz[200005];
int Find(int x){return x==fa[x]?x:fa[x]=Find(fa[x]);}
int Kruskal(){
ans=1;
for(int i=1;i<=N;i++) fa[i]=i,sz[i]=1;
for(int i=1;i<N;i++){
int u=E[i].u;
int v=E[i].v;
int w=E[i].w;
int a=Find(u);
int b=Find(v);
if(a!=b){
if((w+1)<=S) ans=ans*Power(S-w+1,sz[a]*sz[b]-1)%998244353;
sz[b]+=sz[a];
fa[a]=b;
}
}return ans;
}
signed main()
{
scanf("%lld",&T);
while(T--){
scanf("%lld%lld",&N,&S);
for(int i=1;i<N;i++){
scanf("%lld%lld%lld",&E[i].u,&E[i].v,&E[i].w);
}sort(E+1,E+N,[](Edge a,Edge b){return a.w<b.w;});
printf("%lld\n",Kruskal());
}
return 0;
}
CF1857G Counting Graphs 题解的更多相关文章
- 【SP26073】DIVCNT1 - Counting Divisors 题解
题目描述 定义 \(d(n)\) 为 \(n\) 的正因数的个数,比如 \(d(2) = 2, d(6) = 4\). 令 $ S_1(n) = \sum_{i=1}^n d(i) $ 给定 \(n\ ...
- P4778 Counting Swaps 题解
第一道 A 掉的严格意义上的组合计数题,特来纪念一发. 第一次真正接触到这种类型的题,给人感觉好像思维得很发散才行-- 对于一个排列 \(p_1,p_2,\dots,p_n\),对于每个 \(i\) ...
- Atcoder Beginner Contest ABC 284 Ex Count Unlabeled Graphs 题解 (Polya定理)
题目链接 弱化版(其实完全一样) u1s1,洛谷上这题的第一个题解写得很不错,可以参考 直接边讲Polya定理边做这题 问题引入:n颗珠子组成的手串,每颗珠子有两种不同的颜色, 如果两个手串能够在旋转 ...
- POJ 2386 Lake Counting 搜索题解
简单的深度搜索就能够了,看见有人说什么使用并查集,那简直是大算法小用了. 由于能够深搜而不用回溯.故此效率就是O(N*M)了. 技巧就是添加一个标志P,每次搜索到池塘,即有W字母,那么就觉得搜索到一个 ...
- [luogu7418]Counting Graphs P
参考[luogu7417],同样求出最短路,得到二元组$(x,y)$并排序,记$tot_{(x,y)}$为$(x,y)$的数量 其中所给的两个条件,即分别要求: 1.$(x,y)$只能和$(x\pm ...
- CF908A New Year and Counting Cards 题解
Content 有 \(n\) 张卡牌,每张卡牌上只会有大小写字母和 \(0\sim 9\) 的阿拉伯数字.有这样一个描述:"如果卡牌正面写有元音字母(\(\texttt{A,E,I,O,U ...
- CF335E Counting Skyscrapers 题解
提供一种最劣解第一且巨大难写的做法( Bob 显然真正的楼量可以达到 \(314!\),是没办法直接做的,再加上唯一方案的样例,可以猜测有简单的结论. 考虑当楼高度为 \(k(k<h)\) 时, ...
- The 2013 South America/Brazil Regional Contest 题解
A: UVALive 6525 cid=61196#problem/A" style="color:blue; text-decoration:none">Atta ...
- 【题解】Counting D-sets(容斥+欧拉定理)
[题解]Counting D-sets(容斥+欧拉定理) 没时间写先咕咕咕. vjCodeChef - CNTDSETS 就是容斥,只是难了一二三四五\(\dots \inf\)点 题目大意: 给定你 ...
- 【题解】晋升者计数 Promotion Counting [USACO 17 JAN] [P3605]
[题解]晋升者计数 Promotion Counting [USACO 17 JAN] [P3605] 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训.!牛是可怕的管理者! [题目描 ...
随机推荐
- 回声消除AEC(Acoustic Echo Cancellation)概括介绍及基本原理分析
回声消除的基本概念 回音消除(Acoustic Echo Cancelling)是透过音波干扰方式消除麦克风与喇叭因空气产生回受路径(feedback path)而产生的杂音.通俗一点来说,回声消 ...
- UDP、IMCP、ARP协议通过netmap解析的实现。
上一篇文章我们讲了一个异步的线程池大概需要如何去实现,现在的话,我们如何来解析一个UDP的包. 环境的搭配 这个环境的问题困扰了很久,这个netmap已经不再更新了,支持Ubuntu16.04-Ubu ...
- 检验实时3D像素流送平台好坏的七个标准!(下)
上篇文章我们介绍了<检验实时3D像素流送平台质量的七个标准>中的前四个标准,本文我们将继续给您介绍检验像素流送平台质量的其他三个标准. 您的平台是通过云还是仅通过渲染的图像传输数据? 您的 ...
- 深度观察2024中国系统架构师大会(SACC)
今年的中国系统架构师大会(SACC)在我所在的城市广州举办,很荣幸受邀参加.这次能接触到国内最优秀的架构师,学习他们的架构思想和行业经验.对我而言非常有意义. 大会分为上下午共4场,我参加了上午的多云 ...
- 你是怎么理解ES6中 Promise的?使用场景?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.介绍 Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大 在以往我们如果处理多层异步操 ...
- 记录--盘点 TypeScript 那些奇怪的符号
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和 ...
- Non-local Network:人类早期在CV驯服Transformer尝试 | CVPR 2018
Non-local操作是早期self-attention在视觉任务上的尝试,核心在于依照相似度加权其它特征对当前特征进行增强,实现方式十分简洁,为后续的很多相关研究提供了参考 来源:晓飞的算法工程 ...
- KingbaseES例程_普通表在线转分区表(基于规则)
KingbaseES例程_普通表在线转分区表 概述 普通表转分区表,使用视图的替换式规则,以路由方式,实现在线转移数据. 数据准备 /*普通大表*/ create table tab_single a ...
- debian12 出现Waiting for suspend/resume device ... Begin: Running /scripts/local-block ... done.
/etc/initramfs-tools/conf.d/resume里对应的交换分区的uuid不正确 删除/etc/initramfs-tools/conf.d/resume 再运行 sudo upd ...
- 花式栈溢出 CTFshowpwn88
花式栈溢出 在这之前确实对这方面了解很少,一般这种花式栈溢出不仅仅要求你能发现漏洞,最主要的是你要有随机应变的能力 这个题是一个64位的题目看一下保护 canary 和 nx保护都开了,我们用ida打 ...