\(\mathcal{Description}\)

  link.

  有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树。对 \(10^9+7\) 取模。

  \(2\le n\le17\),边集大小 \(0\le m_i\le\frac{n(n-1)}2\)。

\(\mathcal{Solution}\)

  \(n\) 很小,考虑容斥。枚举这 \(n-1\) 个边集的子集,将子集内的边集的边加入图,用矩阵树定理求出生成树个数,容斥一下就好啦。复杂度 \(\mathcal O(2^nn^3)\)。

\(\mathcal{Code}\)

#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream> const int MAXN = 17, MOD = 1e9 + 7;
int n, m, d[MAXN + 5][MAXN + 5];
std::vector<std::pair<int, int> > able[MAXN + 5]; inline int qkpow ( int a, int b, const int p = MOD ) {
int ret = 1;
for ( ; b; a = 1ll * a * a % p, b >>= 1 ) ret = 1ll * ret * ( b & 1 ? a : 1 ) % p;
return ret;
} inline int det ( int d[MAXN + 5][MAXN + 5] ) {
int ret = 1, swp = 1;
for ( int i = 1; i < n; ++ i ) {
for ( int j = i; j < n; ++ j ) {
if ( d[j][i] ) {
if ( i ^ j ) std::swap ( d[i], d[j] ), swp *= -1;
break;
}
}
if ( ! d[i][i] ) return 0;
ret = 1ll * ret * d[i][i] % MOD;
int inv = qkpow ( d[i][i], MOD - 2 );
for ( int j = i + 1; j < n; ++ j ) {
int c = 1ll * inv * d[j][i] % MOD;
for ( int k = i; k < n; ++ k ) d[j][k] = ( d[j][k] - 1ll * c * d[i][k] % MOD + MOD ) % MOD;
}
}
return ( ret * swp + MOD ) % MOD;
} int main () {
scanf ( "%d", &n );
for ( int i = 1, m; i < n; ++ i ) {
scanf ( "%d", &m );
for ( int u, v; m --; ) {
scanf ( "%d %d", &u, &v );
able[i].push_back ( { u, v } );
}
}
int ans = 0;
for ( int s = 1; s < 1 << n >> 1; ++ s ) {
int bit = 0; memset ( d, 0, sizeof d );
for ( int i = 1; i < n; ++ i ) {
if ( ( s >> i - 1 ) & 1 ) {
++ bit;
for ( int j = 0; j ^ able[i].size (); ++ j ) {
int u = able[i][j].first, v = able[i][j].second;
++ d[u][u], ++ d[v][v], -- d[u][v], -- d[v][u];
if ( d[u][v] < 0 ) d[u][v] += MOD;
if ( d[v][u] < 0 ) d[v][u] += MOD;
}
}
}
ans = ( ans + ( ( bit & 1 ) ^ ( n & 1 ) ? det ( d ) : -det ( d ) ) ) % MOD;
}
printf ( "%d\n", ( ans + MOD ) % MOD );
return 0;
}

Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡的更多相关文章

  1. 「SHOI2016」黑暗前的幻想乡 解题报告

    「SHOI2016」黑暗前的幻想乡 sb题想不出来,应该去思考原因,而不是自暴自弃 一开始总是想着对子树做dp,但是状态压不起去,考虑用容斥消减一些条件变得好统计,结果越想越乱. 期间想过矩阵树定理, ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. [LOJ2027] [SHOI2016] 黑暗前的幻想乡

    题目链接 LOJ:https://loj.ac/problem/2027 洛谷:https://www.luogu.org/problemnew/show/P4336 Solution 这题很像[ZJ ...

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

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

随机推荐

  1. JDBC 处理sql查询多个不确定参数

    JDBC程序,为了防止SQL注入,通常需要进行参数化查询,但是如果存在多个不确定参数,就比较麻烦了,查阅了一些资料,最后解决了这个问题,现在这里记录一下:   public List<TabDl ...

  2. Go语言发邮件

    发送邮件是实际业务中经常会用到的一个功能,而在Go语言中实现发送邮件的库也有很多,这篇文章将介绍go语言中如何发邮件. 1. 登录QQ邮箱,选择账户,开启POP3/SMTP服务和IMAP/SMTP服务 ...

  3. Windows系统上搭建Clickhouse开发环境

    Windows系统上搭建Clickhouse开发环境 总体思路 微软的开发IDE是很棒的,有两种:Visual Studio 和 VS Code,一个重量级,一个轻量级.近年来VS Code越来越受欢 ...

  4. 《挑战程序设计竞赛》1.6.2-POJ的题目Ants

    #include <stdio.h> #define max(a, b) (((a) > (b)) ? (a) : (b)) #define min(a, b) (((a) < ...

  5. springBoot--01--快速入门

    笔记源码:https://gitee.com/ytfsL/springboot 1.1 原有Spring优缺点分析 1.1.1 Spring的优点分析 Spring是Java企业版(Java Ente ...

  6. JDK原子操作类

    在Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型.原子更新数组.原子更新引用和原子更新属性(字段).Atomic包里的类基本都是使用Unsafe实现的包装类. ...

  7. netty系列之:请netty再爱UDT一次

    目录 简介 netty对UDT的支持 搭建一个支持UDT的netty服务 异常来袭 TypeUDT和KindUDT 构建ChannelFactory SelectorProviderUDT 使用UDT ...

  8. element 日期时间选择器type = "datetimerange",限制时间的选择范围

    这里限制了只能选择一周的时间   pickerOptions:{          onPick(time){              // 如果选择了只选择了一个时间              i ...

  9. 新手如何入门linux,linux原来还可以这么学

    前言 在这个只有cangls和小白两人的小房间中,展开了一次关于学习方法的讨论. 小白:cangls啊,我想请教一个问题,您是如何记住那么多linux命令的. cangls:我啊,别人都看我的小电影, ...

  10. 为什么 Redis 的查询很快, Redis 如何保证查询的高效

    Redis 如何保证高效的查询效率 为什么 Redis 比较快 Redis 中的数据结构 1.简单动态字符串 SDS 对比 c 字符串的优势 SDS可以常数级别获取字符串的长度 杜绝缓冲区溢出 减少修 ...