题目链接:戳我

幻想乡是个什么东西??(逃

矩阵树定理+容斥

就是设\(dp[i]\)表示至多i个公司修建道路,那么我们有\(ans=dp[n-1]-dp[n-2]+dp[n-3]......\)balabala(就是那个容斥公式嘛qwqwq)

然后每次都跑一次矩阵树定理qwqwq

但是这样的时间复杂度是\(O(n^32^{n-1})\)???所以说。。。跑的。。。2s。。。很勉强qwqwq

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#define MAXN 100010
#define mod 1000000007
using namespace std;
int n,maxx,ans;
int cnt[MAXN],dp[20][20];
struct Node{int x,y;};
vector<Node>node[20];
inline int getnum(int x)
{int cur_ans=0;for(int i=0;i<=21;i++)if(x&(1<<i))cur_ans++;return cur_ans;
}
inline int matrix_tree()
{int cur_ans=1;for(int i=2;i<=n;i++){for(int j=i+1;j<=n;j++){while(dp[j][i]){int t=dp[i][i]/dp[j][i];for(int k=i;k<=n;k++)dp[i][k]=(dp[i][k]-1ll*dp[j][k]*t%mod+mod)%mod;swap(dp[i],dp[j]);cur_ans=(-cur_ans+mod)%mod;}}cur_ans=(1ll*cur_ans*dp[i][i])%mod;}return cur_ans;
}
inline int calc(int x)
{memset(dp,0,sizeof(dp));for(int i=1;i<n;i++){if(x&(1<<(i-1))){for(int j=0;j<node[i].size();j++){int u=node[i][j].x,v=node[i][j].y;dp[u][u]=(dp[u][u]+1)%mod;dp[v][v]=(dp[v][v]+1)%mod;dp[u][v]=(dp[u][v]-1+mod)%mod;dp[v][u]=(dp[v][u]-1+mod)%mod;}}}return matrix_tree();
}
int main()
{#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);freopen("ce.out","w",stdout);#endifscanf("%d",&n);maxx=(1<<n-1)-1;for(int i=1;i<n;i++){int k,u,v;scanf("%d",&k);for(int j=1;j<=k;j++){scanf("%d%d",&u,&v);node[i].push_back((Node){u,v});}}for(int i=0;i<=maxx;i++) cnt[i]=getnum(i);for(int i=0;i<1<<(n-1);++i) ans=(ans+(((n-1-cnt[i])&1)?mod-calc(i):calc(i)))%mod;printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/fengxunling/p/10429756.html

SHOI2016 黑暗前的幻想乡相关推荐

  1. Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理,子集反演)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理) Problem n≤1 ...

  2. P4336 [SHOI2016]黑暗前的幻想乡

    题目 P4336 [SHOI2016]黑暗前的幻想乡 做法 每种颜色恰好一条边,有点难处理啊 根据套路,数据范围这么小,容斥一下所有的情况就可以了 对每种颜色进行状压,表这次只能选这些颜色,做\(n- ...

  3. 【BZOJ4596】[Shoi2016]黑暗前的幻想乡 容斥+矩阵树定理

    [BZOJ4596][Shoi2016]黑暗前的幻想乡 Description 幽香上台以后,第一项措施就是要修建幻想乡的公路.幻想乡有 N 个城市,之间原来没有任何路.幽香向选民承诺要减税,所以她打 ...

  4. [BZOJ4596][Shoi2016]黑暗前的幻想乡-Matrix Tree 矩阵树定理

    黑暗前的幻想乡 Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日 ...

  5. BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4596 https://www.luogu.org/problemnew/show/P4336#su ...

  6. ●BZOJ 4596 [Shoi2016]黑暗前的幻想乡

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4596 题解: 容斥,矩阵树定理,矩阵行列式 先说说容斥:(一共有 N-1个公司) 令 f[i ...

  7. bzoj 4596: [Shoi2016]黑暗前的幻想乡

    这个题貌似奶了一口trump,,, 本来看到一个公司一条边,而且N是那么科学,肯定要容斥了,然后蛋疼的想应该怎么求生成树.. 本来一开始乱说了个矩阵树定理,然而忘了,就像奇奇怪怪的东西了..然并卵,正 ...

  8. [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)

    传送门 Description 给出 n 个点和 n−1 种颜色,每种颜色有若干条边.求这张图多少棵每种颜色的边都出现过的生成树,答案对 109+7 取模. Input 第一行包含一个正整数 N(N& ...

  9. 洛谷 P4336 [SHOI2016] 黑暗前的幻想乡 题解

    前置芝士 Kirchhoff 矩阵树定理 Kirchhoff矩阵树定理解决了一个问题:对于一个确定的无向图,其究竟有多少个生成树? 对于一个无向图,我们拥有其邻接矩阵 A\bf{A}A. 这里的邻接矩 ...

最新文章

  1. java 对象内存布局_Java--对象内存布局
  2. 项目移植,项目环境问题
  3. Python json模块 - Python零基础入门教程
  4. ATL是如何实现线程安全的引用计数和多线程控制的
  5. 依赖注入例子php,依赖注入小例子
  6. 当网卡收到的包的目的地址是主机上另一个网卡的地址.arp总结
  7. arm linux驱动 知乎_引导 ARM Linux
  8. jmeter-json提取器提取数据
  9. 基于MATLAB产生式系统(植物识别系统)
  10. msm8937 porting iic device
  11. vue项目中使用颜色选择器
  12. 二叉搜索树前序序列转中序和后序
  13. 一些很有意思的文章_拔剑-浆糊的传说_新浪博客
  14. 曾号称永久免费的知名国产浏览器推出 VIP 会员模式,网友吵翻天
  15. 谁在崛起,谁在没落?新一线城市竞争力盘点,用Python绘制动态图带你看懂!...
  16. JPEG图像格式及文件结构
  17. 项目实践-基于视觉的自动驾驶正向碰撞预警(matlab代码)
  18. Java 求接近黄金分割数的鲁卡斯队列分子分母
  19. 新生儿住月子中心20天患败血症 什么是败血症?有哪些危害
  20. excel如何设置下拉选项,只允许选择固定的内容

热门文章

  1. Linux下配置MySQL需要注意的几点
  2. Strtus2工作流程及原理
  3. 管理日志--项目管理科学的产生与发展
  4. Mysql5.5部署MHA
  5. maven中出现 ‘dependencies.dependency.version‘ for xxxx:jar is missing
  6. mongodb幽灵操作的解决方案
  7. postgres-#和postgres=#
  8. django-allauth定制模板(转载)
  9. Django CMS介绍(转载)
  10. groupByKey、reduceByKey区别(转)