传送门

Description

给出 n 个点和 n−1 种颜色,每种颜色有若干条边。求这张图多少棵每种颜色的边都出现过的生成树,答案对 109+7 取模。

Input

第一行包含一个正整数 N(N<=17), 表示城市个数。

接下来 N-1 行,其中第 i行表示第 i个建筑公司可以修建的路的列表:

以一个非负数mi 开头,表示其可以修建 mi 条路,接下来有mi 对数,

每对数表示一条边的两个端点。其中不会出现重复的边,也不会出现自环。

Output

输出一行一个整数,表示所有可能的方案数对 10^9+7 取模的结果。

Sample Input

4

2 3 2 4 2

5 2 1 3 1 3 2 4 1 4 3

4 2 1 3 2 4 1 4 2

Sample Output

17

Solution

随意选的-一个颜色不选+两个颜色不选。。。

暴力枚举所有情况求出生成树个数统计到答案中即可

Code

  1. //By Menteur_Hxy
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<iostream>
  6. #include<algorithm>
  7. #define F(i,a,b) for(register int i=(a);i<=(b);i++)
  8. using namespace std;
  9. typedef long long LL;
  10. int read() {
  11. int x=0,f=1; char c=getchar();
  12. while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
  13. while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
  14. return x*f;
  15. }
  16. const int MOD=1000000007;
  17. bool vis[20];
  18. int n,m[20];
  19. int vx[20][400],vy[20][400];
  20. LL ans,ma[20][20];
  21. LL qpow(LL a,LL b) {
  22. LL t=1;
  23. while(b) {
  24. if(b&1) t=t*a%MOD;
  25. a=a*a%MOD; b>>=1;
  26. }
  27. return t;
  28. }
  29. void dfs(int x,int flag) {
  30. if(x==n) {
  31. memset(ma,0,sizeof(ma));
  32. LL now=1,ret;
  33. F(i,1,n-1) if(vis[i])
  34. F(j,1,m[i]) ma[vx[i][j]][vx[i][j]]++,ma[vy[i][j]][vy[i][j]]++,
  35. ma[vx[i][j]][vy[i][j]]--,ma[vy[i][j]][vx[i][j]]--;
  36. int i,j,k;
  37. for(i=2;i<=n;i++) {
  38. for(j=i;j<=n;j++) if(ma[j][i]) break;
  39. if(j>n) break;
  40. if(j!=i) {
  41. flag=-flag;
  42. F(k,i,n) swap(ma[i][k],ma[j][k]);
  43. }
  44. now=now*ma[i][i]%MOD; ret=qpow(ma[i][i],MOD-2);
  45. for(j=i;j<=n;j++) ma[i][j]=ma[i][j]*ret%MOD;
  46. for(j=i+1;j<=n;j++) for(ret=ma[j][i],k=i;k<=n;k++)
  47. ma[j][k]=(ma[j][k]-ret*ma[i][k]%MOD+MOD)%MOD;
  48. }
  49. if(i>n) ans=(ans+flag*now+MOD)%MOD;
  50. return ;
  51. }
  52. vis[x]=1; dfs(x+1,flag);
  53. vis[x]=0; dfs(x+1,-flag);
  54. }
  55. int main() {
  56. n=read();
  57. F(i,1,n-1) {
  58. m[i]=read();
  59. F(j,1,m[i]) vx[i][j]=read(),vy[i][j]=read();
  60. }
  61. dfs(1,1);
  62. printf("%lld",ans);
  63. return 0;
  64. }

[luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)的更多相关文章

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

    题目描述 给出 $n$ 个点和 $n-1$ 种颜色,每种颜色有若干条边.求这张图多少棵每种颜色的边都出现过的生成树,答案对 $10^9+7$ 取模. 输入 第一行包含一个正整数 N(N<=17) ...

  2. luoguP4336 [SHOI2016]黑暗前的幻想乡 容斥原理 + 矩阵树定理

    自然地想到容斥原理 然后套个矩阵树就行了 求行列式的时候只有换行要改变符号啊QAQ 复杂度为\(O(2^n * n^3)\) #include <cstdio> #include < ...

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

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

  4. 【BZOJ4596】黑暗前的幻想乡(矩阵树定理,容斥)

    [BZOJ4596]黑暗前的幻想乡(矩阵树定理,容斥) 题面 BZOJ 有\(n\)个点,要求连出一棵生成树, 指定了一些边可以染成某种颜色,一共\(n-1\)种颜色, 求所有颜色都出现过的生成树方案 ...

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

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

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

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

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

    P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理(高斯消元+乘法逆元)+容斥 ans=总方案数 -(公司1未参加方案数 ∪ 公司2未参加方案数 ∪ 公司3未参加方案数 ∪ ...... ∪ ...

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

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

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

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

随机推荐

  1. SQL SEVER 2008中的演示样例数据库

    SQL SEVER 2008数据库是什么我就不说了,我在这里分享一下怎样学习SQL SEVER 2008数据库,假设是对数据库或是SQL SEVER 数据库全然陌生或是不熟悉的人来说,建议看看一些视频 ...

  2. Android TextView 设置行间距

    Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacin ...

  3. linux驱动由浅入深系列:tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音频子系统之一【转】

    本文转载自:http://blog.csdn.net/radianceblau/article/details/64125411 目前linux中主流的音频体系结构是ALSA(Advanced Lin ...

  4. C#如何读写和创建INI文件(经典)转

    C#如何读写和创建INI文件 分类: c#程序设计2011-11-27 20:42 4935人阅读 评论(2) 收藏 举报 inic#stringbuffernullfile 在做项目过程中,有时需要 ...

  5. bzoj 4521 [ Cqoi 2016 ] 手机号码 —— 数位DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4521 数位DP,记录好多维状态: 写了半天,复杂得写不下去了,于是参考一下TJ... 练习简 ...

  6. Java -JVM:JVM百科

    ylbtech-Java -JVM:JVM百科 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机 ...

  7. JavaI/O 系统

    1.JavaI/O 系统概述 A.  输入输出(I/O):指的是计算机与外部世界,或者一个程序与计算机的其余部分之间的接口 B. 流的概念(流:Stream) 流的基本特性:有数据.有方向 2. 流的 ...

  8. Coursera Algorithms week2 基础排序 练习测验: Permutation

    题目原文: Given two integer arrays of size n , design a subquadratic algorithm to determine whether one ...

  9. ACM_一道耗时间的水题

    一道耗时间的水题 Time Limit: 2000/1000ms (Java/Others) Problem Description: Do you know how to read the phon ...

  10. @PathVariable注解的使用和@Requestparam

    一. @PathVariable @PathVariable这是一个路径映射格式的书写方式注解,在类映射路径的后加上/{对应方法参数中属性@PathVariable("code") ...