首页 > 其他分享 >图计数(三个思想,贼重要,紫题,非常有东西)

图计数(三个思想,贼重要,紫题,非常有东西)

时间:2024-08-12 21:05:36浏览次数:5  
标签:条边 排列 个点 思想 计数 集合 点数 紫题 数量

https://www.luogu.com.cn/problem/AT_abc180_f 第3题     图计数 查看测评数据信息

给n个节点m条边,构造一些无向图,构造出来的图需要满足以下条件:

(1)图中没有自环

(2)图中每个点的度最大是2

(3)图中连通块大小最大为L

问能构造出多少个这样的图出来,答案可能很大,对1e9+7取模

输入格式

 

第一行三个整数n,m,L

2<=n<=300,1<=m,L<=n

 

输出格式

 

一个整数

 

输入/输出例子1

输入:

3 2 3

 

输出:

3

 

样例解释

 

在了解此题前,我们先学一些前置知识

 

前置知识


 

环和链的重复性


1.对于一个链,反转一下还是同一副图,例如:

 

 

 

 

2.对于一个环,把图翻过来还是同一幅图

 想成立体空间,把这个图反转过来,这样的图是同一个图

 

 

 

根据点数计算不同链的数量


 

对于一个链

n个节点,构成的不同图数量
n! / 2

很简单,因为会有重复,把链反转还是同一个链,所以结果要除二

 

 

根据点数计算不同环的数量(圆排列,项链排列)


映射思想


 

今天的第一个思想:运用映射思想
如果算A集合很难算,但我知道B集合有多少个,且B与A有关系,那么就可以用B映射A

例如,我们想求A集合内成员数量,但是正面无法算,可是我们知道B集合有5个成员,且1个A集合相当于5个B集合,那么A集合成员数量就可以通过B集合成员数量推出来,即 A集合数量=B集合数量*5  =  5*5  =  25

 

这里引入几个概念

 

圆排列

 


 

圆排列:对于n个节点能构成多少个不同的圆,注意是二维(2D)的,就是在一个二维平面,顺时针看不一样才算不同排列

正面算很难是吧,假设此时n=3

 

根据映射思想,我们可以算出全排列数量,即线性排列数量,很好算嘛,n! 种

然后我们再算一个圆(任意一个),它对应的排列数量,怎么求?我们可以先暂时割掉一个边,然后再dfs就出来顺序了,如上图

先割掉(1,3)这条边,我们dfs一遍,就是{1,2,3},那么这就是一个排列了,由于一共可以割掉n条边,所以有n种

一个圆对应这么多个排列数量,我们总共有那么多个排列数量,我们用总共/单个,不就算出来数量了吗

即  n! / n = (n-1)!

 

简化:假设有n个点,那么有n!种线性排列,有n个圆上面的排列(n个切割点)

至此推出了圆排列公式:(n-1)!

 

 

 

 

 

项链排列


 

项链排列:对于n个节点能构成多少个不同的圆,注意是二维(3D)的,就是在一个三维平面,顺时针看不一样也算同一个排列

假设有n个点,那么有n!种线性排列,有(n-1)!圆排列,我们观察一下圆排列和项链排列可以观察出一个规律:

假设n=3,那么这个项链排列有2个(固定着1,把图反转一下,运用空间想象力哈),根据圆排列计算公式,(n-1)!=(3-1)!=2!=2,那么把这些值加在一起就可以发现规律了!

 

 

 

圆排列是项链排列的2倍
至此推出了项链排列公式:(n-1)! / 2

 

 

 

本题做法


 

根据题意,图会构成:

1) 一条链,边数=点数-1
2) 一个环,边数=点数

边数和点数有一种对应关系,我们dp定义关系只用点就ok

f[i][j]:当前图考虑了i个点,j条边

我们假设新加入k个点,和图原来的构成:
1)链的情况
现在加入k个点,相当于加入k-1条边
在他之前的图,有i-k个点,j-(k-1)条边

 

我们这k个点从总点数选对吧,那么有多少选择方法?


之前图的点数不可再选了
剩余的就是可以选的
总共可选点数 - 之前图的点数 即可
C(n-(i-k), k)

注意重复情况!我们选k个节点,我们分别考虑每个点
第一次:选1 2 3
第二次:选1 3 2
那不就重复了吗,要去重

技巧:相当于排序,有一种顺序,我们让最小点先进入选择的序列中,一定要放进去!这样就不重复了
那么此时相当于
C(n-(i-k)-1, k-1)

选出来后考虑如何排列


2)环的情况
现在加入k个点,相当于加入k条边
原来图点数 i-k,边数 j-k

 

标签:条边,排列,个点,思想,计数,集合,点数,紫题,数量
From: https://www.cnblogs.com/didiao233/p/18355742

相关文章

  • 数据结构 顺序队列(计数器版)
    在实现循环队列时,为了区分队列为空和队列满的情况,我们通常会浪费一个位置。也就是说,如果队列的总容量是100,那么实际上只能存储99个元素。这是因为我们需要保留一个位置来判断队列是满的还是空的。如果我们不这样做,那么在队列满和队列空时,front和rear指针都会指向同一个位置,......
  • 读《大道至简:软件工程实践者的思想》有感
    《大道至简:软件工程实践者的思想》是一本由软件工程师周爱民创作的一部有关软件工程行业的巨著,其中的许多内容看似需要许多专业知识才能读懂,但其中心思想对于我这个初学者也有很深的影响和启发。书中提到,程序的构成是算法、结构和方法的结合。编程的首要任务是理清逻辑关系和依赖......
  • 性能分析思想
    性能分析思想作为新手,经历了性能测试需求分析、性能测试计划、性能测试压测工具/脚本等前置的一系列准备后,到了实施环节,支棱起来压测后,怎么判断有没有问题呢?本文主要讲一下性能分析思想的几种方法,让大家知道在压测过程中发现了问题后如何去分析问题。性能分析思想,根据我的......
  • lg组合计数
    组合计数关于记号\[C_n^m={n\choosem}=A_n^m/m!=n^{\underline{m}}/m!\]插板法插板法:分集合问题\(\iff\)不定方程正整数解计数问题\[{n-1\choosem-1}\]创造条件法(构造双射),即,构造元素集合\(A,B\),以及一个\(A,B\)之间的双射\(f\),则把计数\(A\)变成计数\(B\)。......
  • NOIP模拟 三元子序列计数
    题意给一个长度为\(n\)的排列\(a\),和一个\(3\)的排列\(p\)。求问\(a\)有多少长度为\(3\)的子序列,满足将其中的元素从小到大编号后为\(p\)。思路仔细手玩一下会发现很难找到一个对于任意\(p\)的通解,实际上\(p\)的情况可以做一些合并:原\(p\)归约方法(对于\(......
  • 递归思想以及晕递归的解决方案
    什么情况下可以用递归的思想一个问题可以被分为多个子问题,且子问题之间不冲突,并且多个子问题解决后,问题也被解决了。就可以用递归。递归的思路递归首先有一个返回条件,就是说函数肯定不能无限递归下去,那么就要有一个在问题规模较小的时候可以判断的结束条件。其次递归分为“超......
  • 凸多边形 k 划分计数
    凸多边形k划分计数给定\(n,k\),求凸\(n\)边形划分成\(k\)个不相交部分的方案数。sol先引入一个定理:Raney定理:和为\(1\)的整数序列的所有循环位移序列中有且仅有一个满足任意前缀和大于0。证明可以考虑任取一个循环位移序列,然后求前缀和,找到最靠右的前缀和最小的位......
  • IEC104初学者教程,第九章:计数量召唤流程详解
    第九章:计数量召唤流程详解平时学习规约或调试IEC104或IEC101设备,需要IEC104/101模拟器,推荐一款:主站下载地址:IEC104主站模拟器从站下载地址:IEC104从站模拟器在IEC60870-5-104(简称IEC104)协议中,计数量召唤(CounterInterrogation,简称CI)是一种特定的功能,用于获取远程终端设备(RTU......
  • COUNTING-SORT(计数排序) and
    计数排序             计数排序假设n个输入元素(适用于小范围区间)中的每一个都是在0到k区间内的一个整数,其中k为某个整数。当k=O(n)时,排序的运行时间为.    计数排序的基本思想:对每一个输入的元素x,确定小于x的元素个数。利用这一信息,就可以直接把x......
  • FPGA设计之跨时钟域(CDC)设计篇(5)----同步FIFO的两种设计方法(计数器法/高位扩展法 | 手撕
    1、什么是FIFO?        FIFO(FirstInFirstOut)是一种先进先出的数据缓存器,在逻辑设计里面用的非常多。它是一种存储器结构,被广泛应用于芯片设计中。FIFO由存储单元队列或阵列构成,第一个被写入队列的数据也是第一个从队列中读出的数据。        FIFO设计可......