题意:

现在有一个$n$个点的树形图被拆开,现在你知道其中$m$条边,已经$q$对点的$LCA$,试求原先的树有多少种可能。

解法:

考虑$dp$,$f(x,S)$表示$x$的子树内的点集为$S$(不包括$x$的方案数)

$S$被拆成$S_0 ,S_1, S_2 ... S_m$,每个集合

这样考虑$LCA(a,b) =c$,与$<x,y> ∈ E$对$dp$的影响。

前者相当于$a,b$分属于两个$S_i$,

假设$x$连向的点为$y_0,y_1...$,

后者相当于不存在$S_i$中含有两个$y_i$ 且 当$S_i$中含有一个$y_i$时,必须要将$y_i$作为$S_i - \{ y_i \}$的父节点。

这样,由于每一层要背包,还要状态压缩,代码十分的复杂。

考虑类比转二叉树的方法,$f(x,S)$ 由 $f(x,S \oplus S0) \cdot f(p, S0 \oplus p)$ 转移过来。

这样代码会简化许多。

枚举子集的时候应用 $ S_0 = S \& (S_0-1)$ 的技巧。

这样,总复杂度 $O(n*3^n + q*n*2^n )$。

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector> #define N 14
#define LL long long
#define bit(x) (1<<(x)) using namespace std; int n,m,q;
int g[N];
LL f[N][<<N];
vector<int> LCA[N]; int get_bit(int S)
{
for(int i=;i<n;i++)
if(S&bit(i)) return i;
return -;
} int cnt_bit(int S)
{
int ans=;
for(;S;S>>=) if(S&) ans++;
return ans;
} bool check(int x,int S)
{
for(int i=;i<(int)LCA[x].size();i++)
if((S&LCA[x][i]) != LCA[x][i]) return ;
return ;
} LL dp(int x,int S)
{
if(f[x][S]!=-) return f[x][S];
if(!S) return f[x][S] = ;
f[x][S]=;
int t=get_bit(S);
for(int S0=S;S0;S0=(S0-)&S)
if(S0&bit(t))
{
bool flag=;
for(int i=;i<(int)LCA[x].size();i++)
if((S0&LCA[x][i]) == LCA[x][i]){flag=; break;}
if(flag || cnt_bit(g[x]&S0)>) continue;
int tmp=get_bit(g[x]&S0);
if(tmp!=-)
{
if(check(tmp,S0) && ( (S0|bit(x)) & g[tmp] ) == g[tmp])
f[x][S] += dp(x,S^S0)*dp(tmp,S0^bit(tmp));
}
else
{
for(int i=;i<n;i++)
if(S0&bit(i))
{
if(check(i,S0) && (S0&g[i]) == g[i])
f[x][S] += dp(x,S^S0)*dp(i,S0^bit(i));
}
}
}
return f[x][S];
} int main()
{
while(~scanf("%d%d%d",&n,&m,&q))
{
for(int i=;i<n;i++)
{
for(int j=;j<(<<n);j++)
f[i][j]=-;
g[i]=;
LCA[i].clear();
}
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
x--,y--;
g[x]|=bit(y);
g[y]|=bit(x);
}
for(int i=,x,y,z;i<=q;i++)
{
scanf("%d%d%d",&x,&y,&z);
x--,y--,z--;
LCA[z].push_back(bit(x)|bit(y));
}
cout << dp(,((<<n)-)^) << endl;
}
return ;
}

Sandy and Nuts的更多相关文章

  1. Codeforces 599E Sandy and Nuts(状压DP)

    题目链接 Sandy and Nuts 题意大概就是给出限制条件求出在该限制条件下树的种数. #include <bits/stdc++.h> using namespace std; # ...

  2. CodeForces 599E Sandy and Nuts 状压DP

    题意: 有一棵\(n(1 \leq n \leq 13)\)个节点的树,节点的标号为\(1 \sim n\),它的根节点是\(1\). 现在已知它的\(m(0 \leq m < n)\)条边,和 ...

  3. Solution -「CF 599E」Sandy and Nuts

    \(\mathcal{Description}\)   Link.   指定一棵大小为 \(n\),以 \(1\) 为根的有根树的 \(m\) 对邻接关系与 \(q\) 组 \(\text{LCA}\ ...

  4. 「算法笔记」状压 DP

    一.关于状压 dp 为了规避不确定性,我们将需要枚举的东西放入状态.当不确定性太多的时候,我们就需要将它们压进较少的维数内. 常见的状态: 天生二进制(开关.选与不选.是否出现--) 爆搜出状态,给它 ...

  5. 【BZOJ-4698】Sandy的卡片 后缀数组

    4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 140  Solved: 55[Submit][Stat ...

  6. BZOJ 4698: Sdoi2008 Sandy的卡片

    4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 106  Solved: 40[Submit][Stat ...

  7. Timus 2068. Game of Nuts 解题报告

    1.题目描述: 2068. Game of Nuts Time limit: 1.0 secondMemory limit: 64 MB The war for Westeros is still i ...

  8. sandy bridge

      SANDY BRIDGE SPANS GENERATIONS Intel Focuses on Graphics, Multimedia in New Processor Design By Li ...

  9. ural 2068. Game of Nuts

    2068. Game of Nuts Time limit: 1.0 secondMemory limit: 64 MB The war for Westeros is still in proces ...

随机推荐

  1. yum安装zabbix监控

    公司的服务器由于没有监控软件监控,最感觉不安全,就开始研究zabbix的安装,最后找到一个最简单的安装方法,在这里记录一下,方便以后的查阅 1.安装zabbix官方的软件配置仓库 rpm -ivh h ...

  2. 第14章8节《MonkeyRunner源代码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树

    在上几节的描写叙述中,我们把HierarchyViewer初始化好.也把ViewServer给装备好了.那如今距离获得一个控件去操作它是万事具备仅仅欠东风了,欠了那一股春风了?欠了的是建立控件树这个东 ...

  3. 牛顿迭代法(Newton&#39;s Method)

    牛顿迭代法(简称牛顿法)由英国著名的数学家牛顿爵士最早提出.可是,这 一方法在牛顿生前并未公开发表(讨厌的数学家们还是鼓捣出来了) 牛顿法的作用是使用迭代的方法来求解函数方程的根. 简单地说,牛顿法就 ...

  4. website link

    error: template with C linkage http://blog.csdn.net/jiong_1988/article/details/7915420http://velep.c ...

  5. Kubernetes对象之Pod

    系列目录 Pod是Kubernetes调度的最小单元.一个Pod可以包含一个或多个容器,因此它可以被看作是内部容器的逻辑宿主机.Pod的设计理念是为了支持多个容器在一个Pod中共享网络和文件系统 因此 ...

  6. Ionic + AngularJS angular-translate 国际化本地化解决方案

    欢迎访问我们的网站,网站上有更多关于技术性的交流:http://www.ncloud.hk/技术分享/ionic-plus-angularjs-angular-translate-国际化本地化解决方案 ...

  7. Java RESTful 框架

    [转载] 最好的8个 Java RESTful 框架 - 2015 Top 8 Java RESTful Micro Frameworks – Pros/Cons - 2017 Restlet - f ...

  8. LeetCode(82)题解: Remove Duplicates from Sorted List II

    https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/ 题目: Given a sorted linked list, ...

  9. # Playables API(翻译)

        The Playables API provides a way to create tools, effects or other gameplay mechanisms by organi ...

  10. Winform拖拽改变无边框窗体大小

    大家在进行Winform开发过程中,很容易就可以完成一个窗口的布局工作,但现在的软件界面美化效果一个比一个好,很多软件都是无边框的,于是乎,你是不是也感叹:winform的带边框的窗体如此丑陋,我一定 ...