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定理)的更多相关文章

  1. [spoj104][Highways] (生成树计数+矩阵树定理+高斯消元)

    In some countries building highways takes a lot of time... Maybe that's because there are many possi ...

  2. BZOJ 4766: 文艺计算姬 [矩阵树定理 快速乘]

    传送门 题意: 给定一个一边点数为n,另一边点数为m,共有n*m条边的带标号完全二分图$K_{n,m}$ 求生成树个数 1 <= n,m,p <= 10^18 显然不能暴力上矩阵树定理 看 ...

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

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

  4. 矩阵树Matrix-Tree定理与行列式

    简单入门一下矩阵树Matrix-Tree定理.(本篇目不涉及矩阵树相关证明) 一些定义与定理 对于一个无向图 G ,它的生成树个数等于其基尔霍夫Kirchhoff矩阵任何一个N-1阶主子式的行列式的绝 ...

  5. 【LOJ#6072】苹果树(矩阵树定理,折半搜索,容斥)

    [LOJ#6072]苹果树(矩阵树定理,折半搜索,容斥) 题面 LOJ 题解 emmmm,这题似乎猫讲过一次... 显然先\(meet-in-the-middle\)搜索一下对于每个有用的苹果数量,满 ...

  6. 生成树的计数 Matrix-Tree(矩阵树)定理

    信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及.事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用.本文从一道信息学竞赛中出现的 ...

  7. 2019.01.02 bzoj2467: [中山市选2010]生成树(矩阵树定理)

    传送门 矩阵树定理模板题. 题意简述:自己看题面吧太简单懒得写了 直接构建出这4n4n4n个点然后按照题面连边之后跑矩阵树即可. 代码: #include<bits/stdc++.h> # ...

  8. [CF917D]Stranger Trees[矩阵树定理+解线性方程组]

    题意 给你 \(n\) 个点的无向完全图,指定一棵树 \(S\),问有多少棵生成树和这棵树的公共边数量为 \(k\in[0,n-1]\) \(n\leq 100\) 分析 考虑矩阵树定理,把对应的树边 ...

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

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

随机推荐

  1. 001-将自己的jar提交maven中央仓

    一.Maven中央仓库提交过程 ① https://issues.sonatype.org 工单管理地址,就是申请上传资格和groupId 的地方. ② https://oss.sonatype.or ...

  2. R中基本函数学习[转载]

    转自:https://www.douban.com/note/511740050/ 1.数据管理 numeric:数值型向量 logical:逻辑型向量 character:字符型向量list:列表 ...

  3. 使用免费的Let's Encrypt通配符证书 升级我们的网站

    Let's Encrypt通配符证书的官方启用日期:2018年3月13日 也就是说,2018年3月13日之后,我们就可以使用Let's Encrypt通配符证书了,当然是免费的. Let's Encr ...

  4. Selenium - Css Selector 使用方法

    什么是Css Selector? Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector可以下载火狐浏览器插件,FireFinder 或 FireBug和 ...

  5. recv函数返回值说明

    recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据. ...

  6. inline详解

    1. 引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是 ...

  7. Leetcode: Binary Tree Level Order Transversal II

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...

  8. CAS机制

    ##################################################################### 我们知道多线程操作共享资源时,会出现三个问题:可见性.有序性 ...

  9. 关于在ASP.NET中使用JavaScript的建议

    一个很恼人的情况,就是当你使用JS在一个ASP,NET应用程序中引用一个在模板页初始化的服务器控件的时候: 比如,我们在模板页有一个TextBox的服务器控件,而且我们想要去获取他的Text:如果你使 ...

  10. Java实现递归将嵌套Map里的字段名由驼峰转为下划线

    摘要: 使用Java语言递归地将Map里的字段名由驼峰转下划线.通过此例可以学习如何递归地解析任意嵌套的List-Map容器结构. 难度:初级 概述 在进行多语言混合编程时,由于编程规范的不同, 有时 ...