HDU 5729 Rigid Frameworks (联通块计数问题)
通过看题解画图可以发现:
不论怎么转,一列里的横边/一行里的竖边始终平行
当我们加固一个格子时,会让它所在的这一行的竖边和这一列的横边保证垂直
而我们的目标是求所有竖边和横边都保证垂直的方案数
把一行里的所有竖边看成一个点,把一列里的所有横边看成一个点。一共$n+m$个点
把图看成二分图,左侧$n$个点,右侧$m$个点。加固一个格子相当于在左侧的一个点和右侧的一个点之间连边!
我们的问题变成了求解二分图的连通图个数!
接下来就是很套路的$DP$了
定义$f(a,b)$表示左边$a$个点,右边$b$个点的连通二分图个数
对于连通图问题,我们依然采用常规的“固定思想”,我们固定左侧第一个点
直接求联通很困难,考虑用不合法的情况相减,可得$DP$方程:
$f(a,b)=3^{ab}-\sum_{i=0}^{a}\sum_{j=0}^{b}f(i,j)C_{a-1}^{i-1}C_{b}^{j}3^{(a-i)(b-j)}$
(注意i=a,j=b是不能转移的)
初值怎么赋需要思考
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 65
#define M1 3605
#define ll long long
using namespace std;
const ll p=; int n,m,T;
int pw3[M1],C[N1][N1],f[N1][N1]; int main()
{
int i,j,a,b; n=; m=;
for(i=,pw3[]=;i<=n*m;i++) pw3[i]=3ll*pw3[i-]%p;
C[][]=;
for(i=;i<=max(n,m);i++)
{
C[i][]=C[i][i]=;
for(j=;j<i;j++)
C[i][j]=(C[i-][j]+C[i-][j-])%p;
}
f[][]=; f[][]=; //pw3[0]=0;
for(a=,b=;b<=m;b++)
{
f[a][b]=pw3[a*b];
for(j=,i=;j<b;j++)
{
f[a][b]=(f[a][b]-1ll*f[i][j]*C[a-][i-]%p*C[b][j]%p*pw3[(a-i)*(b-j)]%p+p)%p;
}
}
for(a=;a<=n;a++)
{
for(b=;b<=m;b++)
{
f[a][b]=pw3[a*b];
for(i=;i<a;i++)
for(j=;j<=b;j++)
f[a][b]=(f[a][b]-1ll*f[i][j]*C[a-][i-]%p*C[b][j]%p*pw3[(a-i)*(b-j)]%p+p)%p;
for(j=,i=a;j<b;j++)
f[a][b]=(f[a][b]-1ll*f[i][j]*C[a-][i-]%p*C[b][j]%p*pw3[(a-i)*(b-j)]%p+p)%p;
}
}
while(scanf("%d%d",&n,&m)!=EOF)
{
printf("%d\n",f[n][m]);
}
return ;
}
HDU 5729 Rigid Frameworks (联通块计数问题)的更多相关文章
- HDU 5729 - Rigid Frameworks
题意: 对于一个由n*m个1*1的菱形组成可任意扭曲的矩形(姑且这么说),求添加斜线*(两种)让菱形变成正方形,使得整个矩形固定且无法扭曲的方案数. 分析: n*m的矩形有如下性质:( 平 ...
- HDU 5729 Rigid Frameworks(连通性DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5729 [题目大意] 给出一个n*m的方格框,可以在单位矩形中添加两种对角线的线,使得其变得稳定,问 ...
- HDU - 1213 dfs求联通块or并查集
思路:给定一个无向图,判断有几个联通块. AC代码 #include <cstdio> #include <cmath> #include <algorithm> ...
- HDU 4738 Caocao's Bridges ——(找桥,求联通块)
题意:给你一个无向图,给你一个炸弹去炸掉一条边,使得整个图不再联通,你需要派人去安置炸弹,且派去的人至少要比这条边上的人多.问至少要派去多少个,如果没法完成,就输出-1. 分析:如果这个图是已经是多个 ...
- 2016 Multi-University Training Contest 1 G. Rigid Frameworks
Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- Codeforces 731C. Socks 联通块
C. Socks time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard input o ...
- Codeforces Round #369 (Div. 2) D. Directed Roads dfs求某个联通块的在环上的点的数量
D. Directed Roads ZS the Coder and Chris the Baboon has explored Udayland for quite some time. The ...
- Educational Codeforces Round 5 - C. The Labyrinth (dfs联通块操作)
题目链接:http://codeforces.com/contest/616/problem/C 题意就是 给你一个n行m列的图,让你求’*‘这个元素上下左右相连的连续的’.‘有多少(本身也算一个), ...
- 【UVA10765】Doves and bombs (BCC求割点后联通块数量)
题目: 题意: 给了一个联通无向图,现在问去掉某个点,会让图变成几个联通块? 输出的按分出的从多到小,若相等,输出标号从小到大.输出M个. 分析: BCC求割点后联通块数量,Tarjan算法. 联通块 ...
随机推荐
- POJ 2411 插头DP
//插头DP,算是广义路径的吧. /* 我是这样想的,定义填数的为0,未填的为1.然后,初始自然是(0,0).我还定义了整个棋盘的状态,不知是否多此一举. 这样,把轮廓线上的格子状态记录.当(I,J) ...
- Android中检測字符编码(GB2312,ASCII,UTF8,UNICODE,TOTAL——ENCODINGS)方法(一)
package com.android.filebrowser; import java.io.*; import java.net.*; public class FileEncodingD ...
- cocos2d js ClippingNode 制作标题闪亮特效
1.效果图: 之前在<Android 高仿 IOS7 IPhone 解锁 Slide To Unlock>中制作了文字上闪亮移动的效果,这次我们来看下怎样在cocos2d js 中做出类似 ...
- Ubuntu下在Eclipse IDE for C/C++ Developers中怎样执行C语言的GTK程序?(已解决)
(已解决.详见Ubuntu 12.04下在Eclipse IDE for C/C++ Developers中执行C语言的GTK程序) 按"Ubuntu下GTK的安装.编译和測试"( ...
- JSONObject.toBean() data转换
//toBean方法不识别date属性 要把VO的DATE该成UTIL包下的DATE 然后加上下面的代码.不然会报错JSONUtils.getMorpherRegistry().registerMo ...
- bzoj 1053 [ HAOI 2007 ] 反素数ant ——暴搜
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1053 试图打表找规律,但无果... 看TJ了,暴搜: 注意参数 w 是 long long. ...
- P4135 作诗——分块
题目:https://www.luogu.org/problemnew/show/P4135 分块大法: 块之间记录答案,每一块记录次数前缀和: 注意每次把桶中需要用到位置赋值就好了: 为什么加了特判 ...
- HTTP服务端JSON服务端
HTTP服务端JSON服务端 最后更新日期: 2014-5-18 Author: Kagula 阅读前提: CMake工具的基本使用 内容简介: CPPCMS是个开源Web开发框架,通过它可以很容易 ...
- centos7用rpm安装mysql5.7【初始用yum安装发现下载非常慢,就考虑本地用迅雷下载rpm方式安装】
1.下载 4个rpm包 mysql-community-client-5.7.26-1.el7.x86_64.rpmmysql-community-common-5.7.26-1.el7.x86_64 ...
- RabbltMQ
协议:AMQP协议 支持事务 端口号:默认端口5672 1.简单队列(simple queue) 一个生产者对应一个消费者 2.工作队列(work queue) 一个生产者对应多个消费者: 轮询分发 ...