题目描述

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

输入

第一行包含一个正整数 N(N<=17), 表示城市个数。
接下来 N-1 行,其中第 i行表示第 i个建筑公司可以修建的路的列表:
以一个非负数mi 开头,表示其可以修建 mi 条路,接下来有mi 对数,
每对数表示一条边的两个端点。其中不会出现重复的边,也不会出现自环。

输出

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

样例输入

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

样例输出

17


题解

容斥原理+矩阵树定理

答案为:随便选的 - 钦定1种颜色不能选的 + 钦定2种颜色不能选的 - ... 。

爆搜每种颜色是否被钦定不能选,然后使用矩阵树定理求出当前条件下的生成树个数即可。

时间复杂度 $O(2^n·n^3)$ 。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 1000000007
typedef long long ll;
using namespace std;
int n , m[18] , vx[18][140] , vy[18][140] , v[18];
ll a[18][18] , ans;
inline ll pow(ll x , int y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
void dfs(int x , int flag)
{
if(x == n)
{
memset(a , 0 , sizeof(a));
int i , j , k;
ll now = 1 , t;
for(i = 1 ; i < n ; i ++ )
if(v[i])
for(j = 1 ; j <= m[i] ; j ++ )
a[vx[i][j]][vx[i][j]] ++ , a[vy[i][j]][vy[i][j]] ++ , a[vx[i][j]][vy[i][j]] -- , a[vy[i][j]][vx[i][j]] -- ;
for(i = 2 ; i <= n ; i ++ )
{
for(j = i ; j <= n ; j ++ )
if(a[j][i])
break;
if(j > n) break;
if(j != i)
{
flag = -flag;
for(k = i ; k <= n ; k ++ )
swap(a[i][k] , a[j][k]);
}
now = now * a[i][i] % mod , t = pow(a[i][i] , mod - 2);
for(j = i ; j <= n ; j ++ ) a[i][j] = a[i][j] * t % mod;
for(j = i + 1 ; j <= n ; j ++ )
for(t = a[j][i] , k = i ; k <= n ; k ++ )
a[j][k] = (a[j][k] - t * a[i][k] % mod + mod) % mod;
}
if(i > n) ans = (ans + flag * now + mod) % mod;
return;
}
v[x] = 1 , dfs(x + 1 , flag);
v[x] = 0 , dfs(x + 1 , -flag);
}
int main()
{
int i , j;
scanf("%d" , &n);
for(i = 1 ; i < n ; i ++ )
{
scanf("%d" , &m[i]);
for(j = 1 ; j <= m[i] ; j ++ )
scanf("%d%d" , &vx[i][j] , &vy[i][j]);
}
dfs(1 , 1);
printf("%lld\n" , ans);
return 0;
}

【bzoj4596】[Shoi2016]黑暗前的幻想乡 容斥原理+矩阵树定理的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. BZOJ4596: [Shoi2016]黑暗前的幻想乡

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

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

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

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

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

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

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

随机推荐

  1. mysql数据库创建和权限分配

    查询安装路径: whereis mysql连接mysql: mysql -u root -p第一步:创建用户CREATE USER 'claim_prod'@'%' IDENTIFIED BY 'Pa ...

  2. Linux安装配置apache

    Linux安装配置apache   1.获取软件: http://httpd.apache.org/  httpd-2.2.21.tar.gz 2.安装步骤: 解压源文件: 1 tar zvxf ht ...

  3. HDU 1285 经典拓扑排序入门题

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. 20155327 EXP8 Web基础

    20155320 EXP8 Web基础 基础问题回答 什么是表单? 表单:可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 表单由文本域.复选框.单选框.菜单.文件地址域.按钮等表单 ...

  5. python 井字棋(Tic Tac Toe)

    说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...

  6. python 生成器按指定大小读取文件

    #!/usr/bin/env python import osimport sys def read_file(fpath): Block_Size = 1024 with open(fpath,&q ...

  7. Spring MVC统一异常处理

    实际上Spring MVC处理异常有3种方式: (1)一种是在Controller类内部使用@ExceptionHandler使用注解实现异常处理: 可以在Controller内部实现更个性化点异常处 ...

  8. Android Studio Xposed模块编写(二)

    阅读本文前,假设读者已经看过Android Studio Xposed模块编写(一)  相关环境已经搭建完成.本文演示案例与上文环境一致,不在赘述. 1.概述 Xposed是非常牛叉的一款hook框架 ...

  9. svn插件下载的两种方式

     1.下载SVN插件     SVN插件下载地址及更新地址,你根据需要选择你需要的版本.现在最新是1.8.x  Links for 1.8.x Release:          Eclipse up ...

  10. Docker_容器化jenkins

    Docker部署接口自动化持续集成环境第二步,容器化一个Jenkins! 接上文:Docker_容器化gitlab 1:pull一个jenkins镜像 docker pull jenkins 2:查看 ...