首页 > 其他分享 >海亮01/23图论专题

海亮01/23图论专题

时间:2024-01-22 21:23:46浏览次数:41  
标签:连通 ch 23 int 海亮 read fa 01 siz

海亮01/23图论专题

个人题单

T12

CF156D

题意

给定一个 \(n\) 个点 \(m\) 条边的带标号无向图,它有 \(k\) 个连通块,求添加 \(k-1\) 条边使得整个图连通的方案数,答案对 \(p\) 取模。

题解

没学过 \(Prüfer\) 序列 的自行学习。

不太会严谨证明

我们发现,如果将 \(k\) 个连通块缩成一个点,那么剩下 \(k\) 个孤立点(有标号),然后问你完全图 \(K_k\) 生成树有多少棵。

这个显然就是 \(Cayley\) 公式,有 \(n^{k-2}\) 种。

但是不太对,因为你没有确定每条边连接的是连通块中哪一个具体的点。

考虑用 \(Prüfer\) 序列重构树的过程,对于每一个序列,每一个点都需要拎出来连边,而这个连边的方案显然有 \(siz_u\) 个(设 \(siz_u\) 是连通块 \(u\) 的大小),然后发现每个连边都互不影响,然后你就赢了:P

最终答案是 \(n^{k-2}\prod siz_{u}\)。

这里需要注意,如果原来给定的图就是一整个连通块,那么方案数显然是 \(1\),不过有一个点的 \(p=1\),所以一定不要 \(puts("1")\) 要 \(1\mod p\) 啊(

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
bool stmemory;
namespace Call_me_Eric{
inline int read(){
    int x = 0, f = 1;char ch = getchar();
    while(ch < '0' || ch > '9'){if(ch == '-') f = -1;ch = getchar();}
    while(ch >= '0' && ch <= '9'){x = (x << 1) + (x << 3) + (ch ^ 48);ch = getchar();}
    return x * f;
}
const int maxn = 1e5 + 10;
int n, m, mod;
int qpow(int x,int a){
    int res = 1;
    while(a){
        if(a & 1)res = (1ll * res * x) % mod;
        x = 1ll * x * x % mod;a >>= 1;
    }
    return res;
}

int fa[maxn], siz[maxn];
int getf(int x){return fa[x] == x ? x : fa[x] = getf(fa[x]);}

void main(){
    n = read(); m = read(); mod = read();
    if(n == 1){printf("%lld\n",1ll % mod);return;}
    for(int i = 1;i <= n;i++)fa[i] = i;
    for(int i = 1;i <= m;i++){
        int u = read(), v = read();
        if(getf(u) != getf(v))fa[getf(u)] = getf(v);
    }
    for(int i = 1;i <= n;i++){siz[getf(i)]++;}
    int ans = 1, cnt = 0;
    for(int i = 1;i <= n;i++){if(siz[i]){ans = (ans * siz[i]) % mod;cnt++;}}
    if(cnt == 1){printf("%lld\n",1ll % mod);return;}
    printf("%lld\n",ans * qpow(n,cnt - 2) % mod);
    return;
}
};
bool edmemory;
signed main(){
    auto stclock = clock();
    Call_me_Eric::main();
    auto edclock = clock();
    cerr << (&stmemory - &edmemory) / 1024.0 / 1024.0 << " Mib cost.\n";
    cerr << (edclock - stclock) * 1.0 / CLOCKS_PER_SEC << " Sec cost.\n";
    return 0;
}

标签:连通,ch,23,int,海亮,read,fa,01,siz
From: https://www.cnblogs.com/Call-me-Eric/p/17981099

相关文章

  • 01_全局异常处理
    -**@RestControllerAdvice**定义全局异常处理类作用在所有的Controller类上-**@ExceptionHandler**声明处理异常的方法##实现步骤1.自定义异常```javapublicclassAccountNotFoundExceptionextendsException{publicAccountNotFoundException(){......
  • 如何备份已经安装并设置AutoHotkey脚本编程环境的Windows电脑系统分区 2024.01.22
     如何备份已经安装并设置AutoHotkey脚本编程环境的Windows电脑系统分区2024.01.22第1步:邮购并制作银灿IS903可启动U盘,量产Emulation-CD-ROM所用ISO镜像选用从www.firpe.cn下载的PE光盘镜像。第2步:正确安装电脑软件并调整电脑各项设置备份硬盘分区表和启动扇区信息转移个......
  • 32位双核TMS320F28379DZWTQR(MCU),HITAG®读卡器芯片HTRC11001T(125kHz)
    1、TMS320F28379DZWTQR ICMCU32BIT1MBFLASH337NFBGATMS320F28379D-Q1的说明C2000™32位微控制器针对处理、感应和驱动进行了优化,以提高实时控制应用(如工业电机驱动器、光伏逆变器和数字电源、电动汽车和运输、电机控制以及感应和信号处理)的闭环性能。C2000系列包含高级性......
  • 0122今日笔记
    一java环境搭建jdk长期支持版本jdk8111721可以到oracle官网下载自己需要的jdk版本下载后安装到D盘(建议不要在c盘)在电脑系统中找到系统设置找到系统环境在系统变量中创建JAVAHOME路径就是直接的dk路径然后在pa然后一直点击确定就行测试是否成功按win+R+cmd进......
  • CEOI2023D1T3(LOJ4019) Brought Down the Grading Server? (分治+欧拉回路)
    因为我们有\(S=2^k\),所以我们先考虑\(k=1\)即\(S=2\)的时候应该怎么做。发现如果我们对于每一个核心从\(t_1\)向\(t_2\)连一条无向边,如果我们把「不交换\(t_1,t_2\)」看成将这条边定向为\(t_1\tot_2\),否则如果「交换\(t_1,t_2\)」看成将这条边定向为\(t_2\tot_1......
  • 阿里云云原生 2023 年度盘点,2024 携手开发者奔赴下一场山海
    ......
  • 阿里云云原生 2023 年度盘点,2024 携手开发者奔赴下一场山海
    ......
  • 02-盒模型:01_margin
    知识点未补充原文件<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>外边距-margin<......
  • 0122 所学内容
    Java基础**注释单行注释//多行注释/**/文档注释/***/**标识符的命名规则1.数字字母下划线$数字不能开头开头大写2.尽量做到见名知意**JAVA开发手册1.不能以下划线美元符号开始结束2.严禁使用中文和拼音与英文混合的情况3.UpperCamelCase(大驼峰命名法)//Hello......
  • 语音合成技术(深度学习方法简介)https://www.cnblogs.com/jacen789/p/14260194.html
    语音合成技术(深度学习方法简介)一、定义语音合成(Text-To-Speech,简称TTS),又称文语转换技术,是将文字信息转变为可以听得懂的、流利的语音输出的一种技术。其与我们比较熟悉的语音识别技术(AutomaticSpeechRecognition,简称ASR)目标相反。ASR是将声音转化为文字,类比于人类的耳朵;而TT......