CSU 1805 Three Capitals(矩阵树定理+Best定理)
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1805
题意:
A和B之间有a条边,A和G之间有b条边,B和G之间有c条边。现在从A点出发走遍所有的边,然后再回到A点,问一共有多少种方法。
思路:
16年湖南省赛题目,这道题目是求欧拉回路的个数,和生成树的计数有一定的联系。
首先给出神奇的Best定理,这是什么鬼定理,反正查不到什么有关该定理的文章。。。
$ec(G)=t_s(G)\cdot deg(s)! \cdot \prod_{v\in V,\ v\ne s} (deg(v)-1)!,\ t_s(G):=$以s为根的外向树的个数。
这个有向图的外向树个数其实和无向图的生成树个数是差不多的,总之就是矩阵树定理,但是稍微还是有点不同的地方。
基尔霍夫矩阵的构造是不太一样的,毕竟一个是无向图,一个是有向图:
无向图中的度数矩阵是每个顶点的度数,有向图中的度数矩阵是每个顶点的入度。
邻接矩阵的话是u->v的边数,这和无向图是差不多的。
然后是矩阵的计算:
无向图的生成树个数=任意n-1阶主子式的值
有向图的外向树个数=除去根节点所在的阶的主子式的值
注意一下,这道题目还需要计算组合数,比如说,A和B之间有a条边,那么我可以选择x条边为入边,那么剩余的a-x条边为出边,在这个过程中就会有不同的选择方法。总的也就是$C(a,x)*C(b,y)*C(c,z)$。
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- #include<cstdio>
- #include<sstream>
- #include<vector>
- #include<stack>
- #include<queue>
- #include<cmath>
- #include<map>
- #include<set>
- using namespace std;
- typedef long long ll;
- typedef pair<int,ll> pll;
- const int INF = 0x3f3f3f3f;
- const int maxn=+;
- const ll mod=1e9+;
- int a,b,c;
- ll f[];
- ll A[][];
- void init()
- {
- f[]=;
- for(int i=;i<=;i++) f[i]=f[i-]*i%mod;
- }
- ll qpow(ll a,ll n)
- {
- ll ans=;
- while(n)
- {
- if(n&) ans=ans*a%mod;
- a=a*a%mod;
- n>>=;
- }
- return ans;
- }
- ll C(ll n,ll m)
- {
- return (f[n]*qpow(f[m],mod-)%mod)*qpow(f[n-m],mod-)%mod;
- }
- ll calc()
- {
- return (A[][]*A[][]%mod-A[][]*A[][]%mod+mod)%mod;
- }
- int main()
- {
- //freopen("in.txt","r",stdin);
- init();
- while(~scanf("%d%d%d",&a,&b,&c))
- {
- if((a+c)& || (a+b)& || (b+c)&) {puts("");continue;}
- ll ans=;
- for(int i=;i<=a;i++) //枚举A->B的边数
- {
- memset(A,,sizeof(A));
- A[][]=(a+b)/;
- A[][]=(a+c)/;
- A[][]=(b+c)/;
- A[][]=-i;
- A[][]=-(a-i);
- A[][]=-(A[][]-i);
- A[][]=-(b+A[][]);
- A[][]=-(A[][]+A[][]);
- A[][]=-(c+A[][]);
- if(A[][]> || A[][]> || A[][]> || A[][]>) continue;
- ll res=(C(a,i)*C(c,-A[][])%mod)*C(b,-A[][])%mod;
- res=(res*calc())%mod;
- for(int i=;i<;i++) res=res*f[A[i][i]-]%mod;
- res=res*f[A[][]]%mod;
- ans=(ans+res)%mod;
- }
- printf("%lld\n",ans);
- }
- return ;
- }
CSU 1805 Three Capitals(矩阵树定理+Best定理)的更多相关文章
- [spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)
In some countries building highways takes a lot of time... Maybe that's because there are many possi ...
- BZOJ 4766: 文艺计算姬 [矩阵树定理 快速乘]
传送门 题意: 给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图$K_{n,m}$ 求生成树个数 1 <= n,m,p <= 10^18 显然不能暴力上矩阵树定理 看 ...
- bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
- 矩阵树Matrix-Tree定理与行列式
简单入门一下矩阵树Matrix-Tree定理.(本篇目不涉及矩阵树相关证明) 一些定义与定理 对于一个无向图 G ,它的生成树个数等于其基尔霍夫Kirchhoff矩阵任何一个N-1阶主子式的行列式的绝 ...
- 【LOJ#6072】苹果树(矩阵树定理,折半搜索,容斥)
[LOJ#6072]苹果树(矩阵树定理,折半搜索,容斥) 题面 LOJ 题解 emmmm,这题似乎猫讲过一次... 显然先\(meet-in-the-middle\)搜索一下对于每个有用的苹果数量,满 ...
- 生成树的计数 Matrix-Tree(矩阵树)定理
信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及.事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用.本文从一道信息学竞赛中出现的 ...
- 2019.01.02 bzoj2467: [中山市选2010]生成树(矩阵树定理)
传送门 矩阵树定理模板题. 题意简述:自己看题面吧太简单懒得写了 直接构建出这4n4n4n个点然后按照题面连边之后跑矩阵树即可. 代码: #include<bits/stdc++.h> # ...
- [CF917D]Stranger Trees[矩阵树定理+解线性方程组]
题意 给你 \(n\) 个点的无向完全图,指定一棵树 \(S\),问有多少棵生成树和这棵树的公共边数量为 \(k\in[0,n-1]\) \(n\leq 100\) 分析 考虑矩阵树定理,把对应的树边 ...
- 【bzoj4596】[Shoi2016]黑暗前的幻想乡 容斥原理+矩阵树定理
题目描述 给出 $n$ 个点和 $n-1$ 种颜色,每种颜色有若干条边.求这张图多少棵每种颜色的边都出现过的生成树,答案对 $10^9+7$ 取模. 输入 第一行包含一个正整数 N(N<=17) ...
随机推荐
- 问题解决 -------- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题 (2012-09-02 13:09:25) 转载▼ 标签: 杂谈 ...
- visualSVN server安装使用
SVN服务推荐使用visualSVN server,安装完成之后自动设置开机启动服务,具体使用如下图:
- 7.5 Models -- Persisting Records
一.概述 1. 在Ember Data上以每个实例为基础,records被持久化.在DS.Model的任何一个实例上调用save()并且它将产生一个网络请求. 2. 下面是一些例子: var post ...
- STA分析(六) cross talk and noise
在深亚微米技术(deep submicron)中,关于crosstalk和noise对design的signal integrate的影响越来越大.主要表现在glitch和对delay的影响. 1)m ...
- Gson(Google)基础
一.所需jar包: gson-x.x.jar(本例使用的是gson-2.7.jar). 二.解析转化: 1.json字符串 < ------ > json String str=&qu ...
- Hive 大数据倾斜总结
在做Shuffle阶段的优化过程中,遇 到了数据倾斜的问题,造成了对一些情况下优化效果不明显.主要是因为在Job完成后的所得到的Counters是整个Job的总和,优化是基于这些 Counters得出 ...
- 2018-2019-2 20165209 《网络对抗技术》Exp1:PC平台逆向破解
2018-2019-2 20165209 <网络对抗技术>Exp1:PC平台逆向破解 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件 ...
- mysql函数之四:concat() mysql 多个字段拼接
语法: COUNT(DISTINCT expr ,[expr ...]) 函数使用说明:返回不同的非NULL 值数目.若找不到匹配的项,则COUNT(DISTINCT) 返回 0 Mysql的查询结果 ...
- Linux 远程连接sftp与ftp
linux sftp远程连接命令 sftp -oPort=60001 root@192.168.0.254 使用-o选项来指定端口号. -oPort=远程端口号 sftp> get /var/w ...
- 开源|如何使用CNN将视频从2D到3D进行自动转换(附源代码)
http://www.sohu.com/a/128924237_642762 全球人工智能 文章来源:GitHub 作者:Eric Junyuan Xie 它是如何运行的? 在运行代码之前,请先根据官 ...