Sol

容斥原理+Matrix-Tree定理.容斥跟小星星那道题是一样的,然后...直接Matrix-Tree定理就可以了...

复杂度\(O(2^{n-1}n^3)\)

PS:调了好久啊QAQ 明明知道了Matrix-Tree定理了以后非常简单QAQ n-1写成n 直接真·爆0.

Code

  1. /**************************************************************
  2. Problem: 4596
  3. User: BeiYu
  4. Language: C++
  5. Result: Accepted
  6. Time:6040 ms
  7. Memory:1296 kb
  8. ****************************************************************/
  9.  
  10. #include<cstdio>
  11. #include<cstring>
  12. #include<utility>
  13. #include<vector>
  14. #include<iostream>
  15. using namespace std;
  16.  
  17. #define mpr(a,b) make_pair(a,b)
  18. #define _0(x) ((x>0?x:-x)>0)
  19. typedef long long LL;
  20. const int N = 18;
  21. const LL p = 1000000007;
  22.  
  23. int n,cnt,S;LL ans;int pow2[N];
  24. vector<pair<int,int> > g[N];
  25. LL a[N][N];
  26.  
  27. inline int in(int x=0,char ch=getchar()){ while(ch>'9'||ch<'0') ch=getchar();
  28. while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x; }
  29. LL Pow(LL a,LL b,LL res=1){ for(;b;b>>=1,a=a*a%p) if(b&1) res=res*a%p;return res; }
  30. void Build(int S){
  31. memset(a,0,sizeof(a));cnt=0;
  32. for(int i=0;i<n-1;i++) if(S&pow2[i]){
  33. cnt++;
  34. for(int j=0;j<g[i].size();j++){
  35. int u=g[i][j].first,v=g[i][j].second;
  36. a[u][v]--,a[v][u]--,a[u][u]++,a[v][v]++;
  37. }
  38. }
  39. for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]=(a[i][j]+p)%p;
  40. // for(int i=0;i<n;i++) for(int j=0;j<n;j++) printf("%10I64d%c",a[i][j]," \n"[j==n-1]);
  41. // cout<<"*******************"<<endl;
  42. }
  43. LL det(int n){
  44. LL res=1;int swpt=0;
  45. for(int i=0,j,k;i<n;i++){
  46. if(!_0(a[i][i])){
  47. for(j=i+1;j<n;j++) if(_0(a[j][i])) break;
  48. if(j>=n) return 0;
  49. for(k=i;k<n;k++) swap(a[i][k],a[j][k]);
  50. swpt++;
  51. }
  52. res=(res*a[i][i]%p+p)%p;
  53. LL inv=Pow(a[i][i],p-2);
  54. // for(j=i+1;j<n;j++) a[i][j]/=a[i][i];
  55. // for(j=i+1;j<n;j++) for(k=i+1;k<n;k++) a[j][k]-=a[j][i]*a[i][k];
  56. for(j=i+1;j<n;j++) for(k=i+1;k<n;k++) a[j][k]=(a[j][k]-a[j][i]*a[i][k]%p*inv%p+p)%p;
  57. }if(swpt&1) return -res;return res;
  58. }
  59. int main(){
  60. n=in();pow2[0]=1;for(int i=1;i<17;i++) pow2[i]=pow2[i-1]<<1;
  61. for(int i=0;i<n-1;i++){ int x=in();for(int j=1,u,v;j<=x;j++) u=in()-1,v=in()-1,g[i].push_back(mpr(u,v)); }
  62. for(S=1;S<pow2[n-1];S++){
  63. // Build(S);
  64. // cout<<cnt<<" "<<det(n-1)<<endl;
  65. Build(S);
  66. if((n-1-cnt)&1) ans=(ans-det(n-1)+p)%p;else ans=(ans+det(n-1))%p;
  67. }cout<<(ans+p)%p<<endl;return 0;
  68. }

  

  

BZOJ 4596: [Shoi2016]黑暗前的幻想乡的更多相关文章

  1. bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 559  Solved: 325[Submit][Sta ...

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

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

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

    真是简单粗暴 把矩阵树定理的运算当成黑箱好了反正我不会 这样我们就可以在O(n^3)的时间内算出一个无向图的生成树个数了 然后题目要求每个工程队选一条路,这里可以考虑容斥原理:全选的方案数-不选工程队 ...

  4. BZOJ 4596: [Shoi2016]黑暗前的幻想乡(容斥+Matrix_Tree)

    传送门 解题思路 看到计数想容斥--\(from\) \(shadowice1984\)大爷.首先求出原图的生成树个数比较容易,直接上矩阵树定理,但这样会多算一点东西,会把\(n-2\)个公司的多算进 ...

  5. 【BZOJ 4596】 4596: [Shoi2016]黑暗前的幻想乡 (容斥原理+矩阵树定理)

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 324  Solved: 187 Description ...

  6. 【BZOJ】4596: [Shoi2016]黑暗前的幻想乡

    [题意]给定n个点的无向完全图,有n-1个公司各自分管一部分路,要求所有公司都有修路的生成树数.n<=17. [算法]容斥原理+生成树计数(矩阵树定理) [题解]每个生成树方案是一个公司有无修路 ...

  7. bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 464  Solved: 264[Submit][Sta ...

  8. bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥)

    bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥) bzoj Luogu 题解时间 看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理. 但是要求每条边都 ...

  9. [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)

    这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...

随机推荐

  1. 动态规划 求解 Minimum Edit Distance

    http://blog.csdn.net/abcjennifer/article/details/7735272 自然语言处理(NLP)中,有一个基本问题就是求两个字符串的minimal Edit D ...

  2. authorization配置

    在 Web.config 文件的<configuration>标记的子标记<authorization>和</authorization>之间用于设置应用程序的授权 ...

  3. C-基本语法与运算

    编译: Technorati 标记: C 1, 编译compilers 命令make 将高级语言转换为低级语言. clang: 1,预处理(preprocessing) 2,编译(complition ...

  4. 小技能——markdown

    如果常常要在电脑上写点东西,比如写笔记.做总结.写博客之类的,花一两个小时学会markdown还是很值的. markdown简介 markdown不是某个软件,而是一种标记语言,标记普通文本的格式,以 ...

  5. ServletContext中常用方法

    ..获取Tomcat的Context的初始化参数. 1.获取Tomcat的server.xml中设置Context的初始化参数. 例如: <Context path="/testcon ...

  6. jsp应用

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  7. 查看mysql数据库的数据引擎

    1, SHOW VARIABLES LIKE 'storage_engine'; 2,show table status from 数据库库名 where name='表名',例: mysql> ...

  8. shell学习之路:shell基础大全1

    http://note.youdao.com/share/?id=a9d02257b639c94323c818bc38423919&type=note   别名命令alias:http://n ...

  9. Linux启动管理:grub

    1.grub中分区表示 Linux 中 /dev/sda1   在grub中为   hd0,0    代表第一个硬盘的第一个分区 Linux中 /dev/sdb3是扩展分区     在grub中为   ...

  10. MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解

    本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍,需要的朋友参考下   MySQL数据库insert和update语句引:用于操作数 ...