【BZOJ 4455】 [Zjoi2016]小星星 容斥计数

dalao教导我们,看到计数想容斥……
卡常策略:枚举顺序、除去无效状态、(树结构)

#include <cstdio>
#include <cstring>
#include <algorithm>
typedef long long LL;
const int N=20;
LL f[N][N];
int n,m,d[N][N],full;
bool yeah[N];
int st[N],cnt;
struct V{
  int to,next;
}c[N<<1];
int head[N],t;
inline void add(int x,int y){
  c[++t].to=y,c[t].next=head[x],head[x]=t;
}
inline void dfs(int x,int fa){
  register int i,j,k;LL sum=0;
  for(i=head[x];i;i=c[i].next)
    if(c[i].to!=fa)
      dfs(c[i].to,x);
  for(i=1;i<=n;++i){
    if(!yeah[i]){
      f[x][i]=0;
      continue;
    }
    f[x][i]=1;
    for(j=head[x];j;j=c[j].next)
      if(c[j].to!=fa){
        sum=0;
        for(k=1;k<=cnt;++k)
          if(d[i][st[k]])
            sum+=f[c[j].to][st[k]];
        f[x][i]*=sum;
      }
  }
}
int main(){
  scanf("%d%d",&n,&m);
  full=(1<<n)-1;
  int i,j,x,y;
  for(i=1;i<=m;++i){
    scanf("%d%d",&x,&y);
    d[x][y]=d[y][x]=1;
  }
  for(i=1;i<n;++i){
    scanf("%d%d",&x,&y);
    add(x,y),add(y,x);
  }
  LL ans=0,sum;
  for(i=1;i<=full;++i){
    cnt=0,sum=0;
    for(j=0;j<n;++j)
      if(i&(1<<j))yeah[j+1]=true,st[++cnt]=j+1;
      else yeah[j+1]=false;
    dfs(1,0);
    for(j=1;j<=n;++j)
      sum+=f[1][j];
    ans+=(((n-cnt)&1)?-1:1)*sum;
  }
  printf("%lld\n",ans);
  return 0;
}

原文地址:https://www.cnblogs.com/TSHugh/p/8470499.html

时间: 2024-09-30 13:31:22

【BZOJ 4455】 [Zjoi2016]小星星 容斥计数的相关文章

4455[Zjoi2016]小星星 容斥+dp

4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 527  Solved: 317[Submit][Status][Discuss] Description 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细 线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这个饰品只剩下了n?1条细线,但 通过这些细线,这颗小星星还是被串在一起,也就是这

bzoj 4455: [Zjoi2016]小星星

链接 http://www.lydsy.com/JudgeOnline/problem.php?id=4455 dp+容斥题意大约是树上的点满足与图上的点一一对应并且图中两两有边,树中也两两有边,求满足条件的方案数 只保证在树在图中两两有边,用dp[i][j]表示树上i点被映射到图中的j点,以i为根的子树方案数,那么方案数可以用dp在$O(n^3)$时间内处理出来 我们把1设为树的根,那么就可以得方案数$\sum\limits_{i=1}^n f(1,i) $ 这时的方案数是有重复的,考虑容斥

【BZOJ-4455】小星星 容斥 + 树形DP

4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 204  Solved: 137[Submit][Status][Discuss] Description 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这个饰品只剩下了n?1条细线,但通过这些细线,这颗小星星还是被串在一起,也就是这些小

数学(容斥计数):LNOI 2016 方

Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1)个格点,我们需要做的就是找出这些格点形 成了多少个正方形(换句话说,正方形的四个顶点都是格点).但是这个问题对于我们来说太难了,因为点数太多 了,所以上帝删掉了这(N+1)×(M+1)中的K个点.既然点变少了,问题也就变简单了,那么这个时候这些格点组成 了多少个正方形呢? Input 第一行三个整数

4455: [Zjoi2016]小星星|状压DP|容斥原理

OrzSDOIR1ak的晨神 能够考虑状压DP枚举子集,求出仅仅保证连通性不保证一一相应的状态下的方案数,然后容斥一下就是终于的答案 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<vector> #include<cmath> #include<queue>

【bzoj 4455】小星星(树型DP+容斥原理)

给一个n个点的图和一个n个点的树,求图和树上的点一一对应的方案数.(N<=17)思路:1.在树的结构上进行tree DP,f[i][j]表示树上点 i 对应图上点 j 时,这个点所在子树的方案数.O(n^3).2.我们可以发现如果按这个定义进行DP,“一一对应”的关系挺难保证.若枚举出全排列得到对应关系,这样就C(n,n)=n! 只能拿到暴力分:那么我们就不限制“一一对应”而改为“一对多”的关系进行tree DP,利用容斥原理达到O(2^n)的复杂度.(P.S.至于为什么用容斥原理我也不清楚,待

BZOJ 1026--windy数(DP&amp;容斥)

1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8856  Solved: 4007[Submit][Status][Discuss] Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? Input 包含两个整数,A B. Output 一个整数 Sample I

Comet OJ - Contest #2 (D 错综的光影所迷惑的思念是) 容斥计数

说完题解后你可能会恍然大悟,但是考试的时候真的想不出来啊~ code: #include <bits/stdc++.h> #define N 4010 #define ll long long #define mod 998244353 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int edges,now,n; int hd[N<<1],to[N<&l

[BZOJ4455][ZJOI2016]数星星(容斥DP)

4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 707  Solved: 419[Submit][Status][Discuss] Description 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细 线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉了.这个饰品只剩下了n?1条细线,但 通过这些细线,这颗小星星还是被串在一起,也就是这