HDU 4305 Lightning Matrix Tree定理
题目链接:https://vjudge.net/problem/HDU-4305
解法:首先是根据两点的距离不大于R,而且中间没有点建立一个图。之后就是求生成树计数了。
Matrix-Tree定理(Kirchhoff矩阵-树定理)。Matrix-Tree定理是解决生成树计数问题最有力的武器之一。它首先于1847年被Kirchhoff证明。在介绍定理之前,我们首先明确几个概念:
1、G的度数矩阵D[G]是一个n*n的矩阵,并且满足:当i≠j时,dij=0;当i=j时,dij等于vi的度数。
2、G的邻接矩阵A[G]也是一个n*n的矩阵, 并且满足:如果vi、vj之间有边直接相连,则aij=1,否则为0。
我们定义G的Kirchhoff矩阵(也称为拉普拉斯算子)C[G]为C[G]=D[G]-A[G],则Matrix-Tree定理可以描述为:G的所有不同的生成树的个数等于其Kirchhoff矩阵C[G]任何一个n-1阶主子式的行列式的绝对值。所谓n-1阶主子式,就是对于r(1≤r≤n),将C[G]的第r行、第r列同时去掉后得到的新矩阵,用Cr[G]表示。
#include <bits/stdc++.h>
using namespace std;
struct Point{
int x,y;
Point(int _x = 0, int _y = 0){
x = _x;
y = _y;
}
Point operator -(const Point &b) const{
return Point(x-b.x,y-b.y);
}
int operator ^(const Point &b) const{
return x*b.y-y*b.x;
}
void input(){
scanf("%d %d", &x,&y);
}
};
struct Line{
Point s,e;
Line(){}
Line(Point _s, Point _e){
s = _s;
e = _e;
}
};
bool onSeg(Point P, Line L){
return ((L.s-P)^(L.e-P))==0 && (P.x-L.s.x)*(P.x-L.e.x)<=0 && (P.y-L.s.y)*(P.y-L.e.y)<=0;
}
int getDis(Point a, Point b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
const int mod = 10007;
long long inv(long long a, long long m){
if(a==1) return 1;
return inv(m%a,m)*(m-m/a)%m;
}
struct Matrix{
int mat[330][330];
void init(){
memset(mat,0,sizeof(mat));
}
int det(int n){
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
mat[i][j] = (mat[i][j]%mod+mod)%mod;
int res=1;
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
if(mat[j][i]!=0){
for(int k=i; k<n; k++){
swap(mat[i][k], mat[j][k]);
}
if(i != j)
res = (-res+mod)%mod;
break;
}
}
if(mat[i][i] == 0){
res = -1;
break;
}
for(int j=i+1; j<n; j++){
int mul = (mat[j][i]*inv(mat[i][i],mod))%mod;
for(int k=i; k<n; k++){
mat[j][k] = (mat[j][k]-(mat[i][k]*mul)%mod+mod)%mod;
}
}
res = (res * mat[i][i])%mod;
}
return res;
}
};
int g[330][330];
Point p[330];
int n, R;
bool check(int k1, int k2){
if(getDis(p[k1], p[k2]) > R*R) return false;
for(int i=0; i<n; i++){
if(i!=k1&&i!=k2){
if(onSeg(p[i],Line(p[k1],p[k2]))){
return false;
}
}
}
return true;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &n,&R);
for(int i=0; i<n; i++) p[i].input();
memset(g, 0, sizeof(g));
for(int i=0; i<n; i++)
for(int j=i+1; j<n; j++)
if(check(i,j))
g[i][j] = g[j][i] = 1;
Matrix ret;
ret.init();
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if(i!=j&&g[i][j]){
ret.mat[i][j]=-1;
ret.mat[i][i]++;
}
printf("%d\n", ret.det(n-1));
}
return 0;
}
HDU 4305 Lightning Matrix Tree定理的更多相关文章
- BZOJ.4031.[HEOI2015]小Z的房间(Matrix Tree定理 辗转相除)
题目链接 辗转相除解行列式的具体实现? 行列式的基本性质. //864kb 64ms //裸的Matrix Tree定理.练习一下用辗转相除解行列式.(因为模数不是质数,所以不能直接乘逆元来高斯消元. ...
- [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列
目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...
- 【证明与推广与背诵】Matrix Tree定理和一些推广
[背诵手记]Matrix Tree定理和一些推广 结论 对于一个无向图\(G=(V,E)\),暂时钦定他是简单图,定义以下矩阵: (入)度数矩阵\(D\),其中\(D_{ii}=deg_i\).其他= ...
- 数学-Matrix Tree定理证明
老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...
- SPOJ.104.Highways([模板]Matrix Tree定理 生成树计数)
题目链接 \(Description\) 一个国家有1~n座城市,其中一些城市之间可以修建高速公路(无自环和重边). 求有多少种方案,选择修建一些高速公路,组成一个交通网络,使得任意两座城市之间恰好只 ...
- HDU - 4305 - Lightning 生成树计数 + 叉积判断三点共线
HDU - 4305 题意: 比较裸的一道生成树计数问题,构造Krichhoof矩阵,求解行列式即可.但是这道题还有一个限制,就是给定的坐标中,两点连线中不能有其他的点,否则这两点就不能连接.枚举点, ...
- HDU 4305 Lightning(计算几何,判断点在线段上,生成树计数)
Lightning Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- BZOJ.4894.天赋(Matrix Tree定理 辗转相除)
题目链接 有向图生成树个数.矩阵树定理,复习下. 和无向图不同的是,度数矩阵改为入度矩阵/出度矩阵,分别对应外向树/内向树. 删掉第i行第i列表示以i为根节点的生成树个数,所以必须删掉第1行第1列. ...
随机推荐
- 协程简介-异步IO
协程 1. 协程,又称微线程,纤程.协程是用户自己控制的,CPU根本不知道协程的存在,CPU只认识线程. 2. 线程切换的时候,会保存在CPU的寄存器里面. 协程切换的时候,却都是由用户自己的实现的. ...
- monitor_guiagent
monitor_guiagent monitor_guiagent.sh #!/usr/bin/env bash #filename : monitor_guiagent.sh #Usage: /us ...
- 【题解】CF#280 C-Game on Tree
感觉对期望也一无所知……(:′⌒`)╮(╯﹏╰)╭ 一直在考虑怎么dp,最后看了题解——竟然是这样的???[震惊]但是看了题解之后,觉得确实很有道理…… 我们可以考虑最后答案的组成,可以分开计算不同的 ...
- BZOJ5339:[TJOI2018]教科书般的亵渎——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5339 https://www.luogu.org/problemnew/show/P4593 小豆 ...
- SPOJ694/DISUBSTR:Distinct Substrings——题解
https://vjudge.net/problem/SPOJ-DISUBSTR https://www.luogu.org/problemnew/show/SP694 http://www.spoj ...
- HDU.1233 还是畅通工程(Prim)
HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...
- poj2409:Let it Bead(置换群 polya定理)
题目大意:长度为n的项链,要染m种颜色,可以通过旋转或翻转到达的状态视为同一种,问有多少种染色方案. 学了一波polya定理,发现很好理解啊,其实就是burnside定理的扩展. burnside定理 ...
- PhoneGap API介绍:File
本文将介绍PhoneGap API——File:通过JavaScript截获本地文件系统.File是用于读取.写入和浏览文件系统层次结构的PhoneGap API. 对象: DirectoryEntr ...
- ADS 安装失败后在此安装在Modify Repair Remove界面循环问题解决
估计是因为Win7和ADS不兼容的原因,第一次安装ADS后一直停在100%的位置,等了好久也没有反应.于是我点了Cancel.准备从新安装,于是就发生了下面的问题:一直在Modify Repair R ...
- Leetcode 703. 数据流中的第K大元素
1.题目要求 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器, ...