[计数DP]How Many Of Them
How Many of Them
题目描述
在无向连通图中,若一条边被删除后,图会分成不连通的两部分,则称该边为割边。
求满足如下条件的无向连通图的数量:
-
由
个结点构成,结点有标号。 -
割边不超过
条。 -
没有重边和自环。
答案对
输入格式
仅一行,两个整数
输出格式
一个整数,表示答案。
样例 #1
样例输入 #1
3 3
样例输出 #1
4
样例 #2
样例输入 #2
5 1
样例输出 #2
453
提示
Source: Gennady Korotkevich (tourist), ITMO University.
做这题前可以做一做连通图Connected Graph
这道题思想很好,运用容斥原理,找到
如何转移呢,连通图Connected Graph这道题,我们知道包含1且
所以需要减去
那如何先求出
即为
好现在就剩下
按照上面的思路,我们可以求出
点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
const int mod=1e9+7;
int n,m;ll f[55][1505],C[1500][1500],h[55],g[55][55][55];
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1)ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
int main()
{
speed();
cin>>n>>m;
for(int i=0;i<=50;i++)
{
C[i][i]=1;C[i][0]=1;
for(int j=1;j<=i;j++)
{
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
h[1]=1;
for(int i=2;i<=n;i++)
{
h[i]=qpow(2,i*(i-1)/2);
for(int j=1;j<=i-1;j++)
{
h[i]-=h[j]*C[i-1][j-1]%mod*qpow(2,(i-j)*(i-j-1)/2)%mod;
h[i]=(h[i]%mod+mod)%mod;
}
}
g[0][0][0]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i-1;j++)
{
for(int k=1;k<=i-1;k++)
{
for(int x=1;x<=min(i-k,j);x++)
{
f[i][j]=(f[i][j]+f[k][0]*C[i-1][k-1]%mod*g[i-k][j-x][x]%mod*qpow(k,x))%mod;
}
}
}
f[i][0]=h[i];
for(int j=1;j<=i-1;j++)
{
f[i][0]-=f[i][j];
f[i][0]=(f[i][0]%mod+mod)%mod;
}
for(int j=0;j<i;j++)//atention
{
for(int k=1;k<=i;k++)
// {
for(int p=1;p<=i;p++)
{
for(int q=0;q<=j;q++)
{
g[i][j][k]=(g[i][j][k]+f[p][q]*C[i-1][p-1]%mod*g[i-p][j-q][k-1]%mod*p)%mod;
}
}
// }
}
}
ll ans=0;
for(int i=0;i<=min(n,m);i++)
{
ans=(ans+f[n][i])%mod;
}
cout<<ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探