状态压缩DP 求简单图的环的个数
来源:互联网 发布:淘宝在哪儿买彩票 编辑:程序博客网 时间:2024/06/05 01:51
题目链接http://www.codeforces.com/contest/11/problem/D
题目的点数不超过20,所以利用状态压缩DP可解
dp[i][j]表示i状态时以j结尾的简单路径的数量,i的二进制表示中为1的表示这个点在路径中
i的二进制中最低位1表示的点是起始点
View Code
#include<cstdio>
#include<cstring>
typedef __int64 lld;
const int maxn = 19;
lld dp[1<<maxn][maxn];//
int mp[maxn][maxn];
int main(){
int n,m,a,b,i,j,k;
while(scanf("%d%d",&n,&m)!=EOF){
memset(mp,0,sizeof(mp));
while(m--){
scanf("%d%d",&a,&b);
a--;b--;
mp[a][b]=mp[b][a]=1;
}
for(i=0;i<(1<<n);i++) for(j=0;j<n;j++) dp[i][j]=0;
for(i=0;i<n;i++) dp[1<<i][i]=1;
lld ans=0;
for(i=0;i<(1<<n);i++){
for(j=0;j<n;j++){
if(!dp[i][j]) continue;
bool flag=0;
for(k=0;k<n;k++){
if((1<<k)&i){
if(!flag&&mp[j][k]&&i!=((1<<j)+(1<<k))){//如果是起始点,且和结束点相连,且点集中至少有三个点,则构成了环
ans+=dp[i][j];
}
flag=1;
}
else if(flag && mp[j][k])
dp[i^(1<<k)][k]+=dp[i][j];
}
}
}
printf("%I64d\n",ans>>1);
}
return 0;
}
- 状态压缩DP 求简单图的环的个数
- 状态压缩dp学习 + poj3254(最简单的状态压缩dp)
- sgu 222 - Little Rooks 简单的状态压缩DP
- HDOJ 4310 - Hero 简单的状态压缩DP
- POJ 3254 Corn Fields(简单的状态压缩dp)
- URAL 1152 False Mirrors(简单的状态压缩dp)
- poj1185 状态压缩的dp
- uva11795 简单状态压缩DP
- 求1的个数(非dp)
- UESTC 1690 这是一道比CCCC简单题难的简单题 状态压缩dp
- POJ1739 基于连通性的状态压缩dp
- hunnu 11101 fix 状态压缩的DP
- HDU 4433 类似于状态压缩的DP
- HDU 1074 第一次的状态压缩DP
- 基于连通性的状态压缩DP
- TSP+dp+状态压缩的本质
- 状态压缩DP----车的摆放4
- HDOJ 4057 - Rescue the Rabbit 简单的AC自动机+状态压缩DP
- hdu 3911 线段树基本功 区间合并
- 线段树练习 区间合并
- poj 2385 动态规划
- ZSTU 3719 AC自动机DP
- poj 3336 计算几何 + bfs
- 状态压缩DP 求简单图的环的个数
- 与树相关的题目 树形DP 总结,不断汇总中
- 树的直径(最长路) 的详细证明
- poj 1849 Two
- poj 2378 水题
- zoj 3349 简单DP 线段树或树状数组优化
- poj 3694 Network 边双连通
- poj 3189 Steady Cow Assignment 枚举+网络流
- poj 2892 树状数组 二分