真是简单粗暴

把矩阵树定理的运算当成黑箱好了反正我不会

这样我们就可以在O(n^3)的时间内算出一个无向图的生成树个数了

然后题目要求每个工程队选一条路,这里可以考虑容斥原理:全选的方案数-不选工程队1能修的路的方案数-不选工程队2能修的路的方案数……+不选工程队12能修的路的方案数+不选工程队13能修的路的方案数……-不选工程队123能修的路的方案数……

这里直接O(2^(n-1))枚举选择状态即可,然后根据不选的个数奇偶来决定在ans上减或加即可

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const int N=20,mod=1e9+7;
int n,a[N][N];
long long ans;
vector<pair<int,int> >v[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int gaosi(int n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]<0)
a[i][j]+=mod;
long long ans=1,f=1;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
long long x=a[i][i],y=a[j][i];
while(y)
{
long long t=x/y;
x%=y;
swap(x,y);
for(int k=i;k<=n;k++)
a[i][k]=(a[i][k]-a[j][k]*t%mod+mod)%mod;
for(int k=i;k<=n;k++)
swap(a[i][k],a[j][k]);
f=-f;
}
}
if(a[i][i]==0)
return 0;
ans=ans*a[i][i]%mod;
}
return f==-1?(mod-ans)%mod:ans;
}
int main()
{
n=read();
for(int i=1;i<n;i++)
{
int m=read();
for(int j=1;j<=m;j++)
{
int x=read(),y=read();
v[i].push_back(make_pair(x,y));
}
}
for(int i=0;i<(1<<(n-1));i++)
{
int s=n-1,x=i;
memset(a,0,sizeof(a));
for(int j=1;j<n;j++,x>>=1)
if(x&1)
{
s--;
for(int k=0;k<v[j].size();k++)
a[v[j][k].first][v[j][k].first]++,a[v[j][k].second][v[j][k].second]++,a[v[j][k].first][v[j][k].second]--,a[v[j][k].second][v[j][k].first]--;
}
if(s&1)
ans=(ans-gaosi(n-1))%mod;
else
ans=(ans+gaosi(n-1))%mod;
}
printf("%d\n",(ans+mod)%mod);
return 0;
}

bzoj 4596: [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. [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)

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

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

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

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

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

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

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

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

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

  8. BZOJ 4596: [Shoi2016]黑暗前的幻想乡

    Sol 容斥原理+Matrix-Tree定理.容斥跟小星星那道题是一样的,然后...直接Matrix-Tree定理就可以了... 复杂度\(O(2^{n-1}n^3)\) PS:调了好久啊QAQ 明明 ...

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

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

随机推荐

  1. 对Kaldi nnet3进行奇异值分解(SVD)以减小模型大小

    用处 基于SVD实现模型压缩以适配低功耗平台     根据nnet3bin/nnet3-copy,nnet3-copy或nnet3-am-copy的"--edits-config" ...

  2. 59. Spring Boot Validator校验【从零开始学Spring Boot】

    大纲: (1) 入门例子: (2) 国际化: (3) 在代码中添加错误信息: (1) 入门例子: Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数 ...

  3. SQLAlchemy(1):单表操作

    SQLAlchemy 是一个 ORM框架:类对应表,类中的字段对应表中的列,类的对象对应表的一条记录:作用:帮助我们使用类和对象快速实现数据库操作操作数据库的方式: 1. 原生SQL - pymysq ...

  4. node.js里的buffer常见操作,copy,concat等实例讲解

    //通过长度构建的buffer内容是随机的 var buffer=new Buffer(100); console.log(buffer); //手动清空buffer,一般创建buffer不会清空 b ...

  5. Educational Codeforces Round 45 (Rated for Div. 2) C、D

      C. Bracket Sequences Concatenation Problem time limit per test 2 seconds memory limit per test 256 ...

  6. C++ fill 和memset

    以下内容来自www.cplusplus.com--------------------------------------------------- FILL: template <class ...

  7. [bzoj3894]文理分科_网络流_最小割

    文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...

  8. 动态替换logback FileAppender/RollingFileAppender 配置- Programmatically configure logback FileAppender/RollingBackAppender

    一.本文实际解决的问题 如何在代码中修改logback的RollingFileAppender配置(本文代码实例为修改日志文件路径) 二.针对的场景: 本文解决的问题属于一个大需求的一部分,需求为:需 ...

  9. ATM取款机模拟——数据结构课设

    今天帮人写的第二篇课设 . ;-) 机智的窝 要求:大概说一下吧,就是要创建一个用户(初始化一账户),模拟ATM的业务(取款,100的整数倍,改密               码,查剩余金额.等等,各 ...

  10. java的输入输出流(一)

    java中i/o流是java中核心的一部分,曾经学过.可是理解不够深入,渐渐的也就忘了,如今在从新学习下java的io处理,写下我学习的笔记.便于记忆,和总结归纳: 本文原创,转载请注明:http:/ ...