题解:

dp很容易想

f[i][j][s]表示匹配到了i点 对应点为j点,状态为s 那么这样的时间复杂度为(3^n*n^2)

然后会发现这其实可以转化为可以重复利用元素的子集卷积

http://www.cnblogs.com/yinwuxiao/p/8471250.html

因为可以发现那些一定是不满足的
这样是2^n*n^3

然而本人并不怎么会调整常数。。所以就被卡常了------以后再改吧。。

还有就是空间差不多是卡着512mb的

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define sz [18][(1<<17)+10]
ll n,m,f[][],l,lim,pos[<<];
ll head[],dp[]sz,count2[];
struct re{
ll a,b;
}a[];
void arr(ll x,ll y)
{
a[++l].a=head[x];
a[l].b=y;
head[x]=l;
}
ll ff1 sz,ff2 sz,ff3 sz;
void dfs(ll x,ll fa)
{
count2[x]=;
ll u=head[x];
while (u)
{
ll v=a[u].b;
if (v!=fa) dfs(v,x),count2[x]+=count2[v];
u=a[u].a;
}
u=head[x];
memset(ff1,,sizeof(ff1));
memset(ff3,,sizeof(ff3));
for (ll i=;i<=n;i++) ff1[i][<<(i-)]=;
for (ll i=;i<=n;i++) ff3[i][<<(i-)]=;
while (u)
{
ll v=a[u].b;
memset(ff2,,sizeof(ff2));
if (v!=fa)
{
for (ll i=;i<=n;i++)
{
for (ll j=;j<=n;j++)
if (f[i][j])
for (ll k=;k<lim;k++)
ff2[i][k]+=dp[v][j][k];
for (ll j=;j<=n;j++)
for (ll k=;k<lim;k++)
if (k>>(j-)&) ff1[i][k]+=ff1[i][k^(<<(j-))];
for (ll j=;j<=n;j++)
for (ll k=;k<lim;k++)
if (k>>(j-)&) ff2[i][k]+=ff2[i][k^(<<(j-))];
for (ll j=;j<lim;j++) ff3[i][j]=ff2[i][j]*ff1[i][j];
for (ll j=;j<=n;j++)
for (ll k=;k<lim;k++)
if (k>>(j-)&) ff3[i][k]-=ff3[i][k^(<<(j-))];
for (ll k=;k<lim;k++) ff1[i][k]=ff3[i][k];
}
}
u=a[u].a;
}
for (ll i=;i<=n;i++)
for (ll j=;j<lim;j++)
if (pos[j]==count2[x])
dp[x][i][j]=ff3[i][j];
}
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
std::ios::sync_with_stdio(false);
cin>>n>>m; lim=<<n;
for (int i=;i<lim;i++)
{
int cnt=;
for (int j=;j<=n;j++)
if (i>>(j-)&) cnt++;
pos[i]=cnt;
}
memset(f,,sizeof(f));
ll c,d;
for (ll i=;i<=m;i++)
{
cin>>c>>d; f[c][d]=; f[d][c]=;
}
for (ll i=;i<=n-;i++)
{
cin>>c>>d; arr(c,d); arr(d,c);
}
dfs(,);
ll ans=;
for (ll i=;i<=n;i++) ans+=dp[][i][lim-];
cout<<ans<<endl;
}

最新文章

  1. vsftpd安装配置 530 Permission denied.错误
  2. Android studio 中的配置编译错误总结
  3. Struts2从一个action转到另一个action的两种方法
  4. C#点击按钮关闭当前窗体 打开另一个窗体。
  5. Button控件常用api
  6. vsftpd
  7. ORACLE 一致性读原理记录
  8. ubuntu 允许端口被连接
  9. kinect 录制彩色和深度视频
  10. 使用文档注释(javadoc)
  11. iOS 基础 第四天(0809)
  12. Java、C#双语版配套AES加解密示例
  13. Sasha and Array
  14. 对于Hibernate的底层浅谈
  15. Spring Cloud中的负载均衡策略
  16. SQLServer之存储过程简介
  17. [LeetCode] 872. Leaf-Similar Trees_Easy tag: DFS
  18. jmeter --http属性管理器
  19. TeamWork#3,Week5,Release Notes of the Alpha Version
  20. GNU C库「glibc」getaddrinfo 发现重大漏洞

热门文章

  1. 海明码 CRC冗余校验码
  2. mysql运行警告
  3. CSS魔法(二)
  4. SysTick_CLKSourceConfig 这个函数
  5. MIPS架构上函数调用过程的堆栈和栈帧
  6. 51nod1222 最小公倍数计数
  7. Git合并一次commit到指定分支
  8. CF115B Lawnmower(贪心)
  9. shiro自定义realm支持MD5算法认证(六)
  10. oracle里的tns是什么意思