UVa 10766 Organising the Organisation(矩阵树定理)

https://vjudge.net/problem/UVA-10766

题意:

给出n, m, k。表示n个点,其中m条边不能直接连通,求生成树个数。

思路:

这也算个裸题,把可以连接的边连接起来,然后矩阵树计算一下即可。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<sstream>
 6 #include<vector>
 7 #include<stack>
 8 #include<queue>
 9 #include<cmath>
10 #include<map>
11 #include<set>
12 using namespace std;
13 typedef long long ll;
14 typedef pair<int,ll> pll;
15 const int INF = 0x3f3f3f3f;
16 const int maxn=60+5;
17
18 int n,m,root;
19 int unable[maxn][maxn];
20 long double C[maxn][maxn];
21
22 long double Gauss()
23 {
24     for(int k=1; k<=n; k++)  //k表示当前行数,因为行数与列数一样,所以这里k也代表了列数
25     {
26         int max_r=k;
27         for(int i=k+1;i<=n;i++)
28             if(fabs(C[i][k])>fabs(C[max_r][k]))  max_r=i;
29         if(C[max_r][k]==0)  return 0;  //有一列为0,行列式的值必为0
30         if(max_r!=k)
31         {
32             for(int j=k;j<=n;j++)
33                 swap(C[k][j],C[max_r][j]);
34         }
35         for(int i=k+1;i<=n;i++)
36         {
37             long double tmp=C[i][k]/C[k][k];
38             for(int j=k;j<=n;j++)
39                 C[i][j]-=tmp*C[k][j];
40         }
41     }
42     long double ans=1;
43     for(int i=1;i<=n;i++)  ans*=C[i][i];  //化为三角阵后计算主对角线元素乘积
44     ans=fabs(ans);
45     return ans;
46 }
47
48 int main()
49 {
50     //freopen("in.txt","r",stdin);
51     while(~scanf("%d%d%d",&n,&m,&root))
52     {
53         memset(unable,0,sizeof(unable));
54         memset(C,0,sizeof(C));
55         for(int i=0;i<m;i++)
56         {
57             int u,v;
58             scanf("%d%d",&u,&v);
59             unable[u][v]=unable[v][u]=1;
60         }
61         for(int i=1;i<=n;i++)
62         {
63             for(int j=i+1;j<=n;j++)
64             {
65                 if(!unable[i][j])
66                 {
67                     C[i][i]++; C[j][j]++;
68                     C[i][j]=C[j][i]=-1;
69                 }
70             }
71         }
72         n--;
73         printf("%.0Lf\n",Gauss());  //%.Lf codeblocks可能不能正确输出,可以用VS测试
74     }
75     return 0;
76 }
时间: 2024-11-03 21:21:33

UVa 10766 Organising the Organisation(矩阵树定理)的相关文章

UVA 10766 Organising the Organisation

https://vjudge.net/problem/UVA-10766 题意: n个员工,除总经理外每个人只能有一个直接上级 有m对人不能成为直接的上下级关系 规定k为总经理 问员工分级方案 无向图生成树的个数与根无关 所以直接用矩阵树定理即可 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; int n,C[51][51]

uva 10766 Organising the Organisation 生成树计数

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1707 题意:给出n, m, k.表示n个点,其中m条边不能直接连通,求生成树个数. 思路:参考周冬的<生成树的计数及其应用>.就是Matrix-Tree定理的应用. 对于一个无向图G,它的生成树个数等于其Kirchhoff矩阵任何一个n-1阶主子式的行列式的绝对值.

Uva 10766 Organising the Organisation (Matrix_tree 生成树计数)

题目描述: 一个由n个部门组成的公司现在需要分层,但是由于员工间的一些小小矛盾,使得他们并不愿意做上下级,问在满足他们要求以后有多少种分层的方案数? 解题思路: 生成树计数模板题,建立Kirchhoff矩阵,利用Matrix_tree定理求解. Kirchhoff矩阵:假设G为n*n矩阵,C为G的入度矩阵(i==j时,C[i][j]等于i的入度;i!=j时,C[i][j]等于零),A为G的邻接矩阵,那么就有Kirchhoff矩阵等于C-A. Matrix_tree定理:G的不同生成树的个数等于其

生成树的计数(基尔霍夫矩阵):UVAoj 10766 Organising the Organisation SPOJ HIGH - Highways

HIGH - Highways In some countries building highways takes a lot of time... Maybe that's because there are many possiblities to construct a network of highways and engineers can't make up their minds which one to choose. Suppose we have a list of citi

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

In some countries building highways takes a lot of time... Maybe that's because there are many possiblities to construct a network of highways and engineers can't make up their minds which one to choose. Suppose we have a list of cities that can be c

矩阵树定理速证

凯莱公式: spanning_trees_num( G ) = spanning_trees_num( G - e ) + spanning_trees_num( G · e ) 矩阵树定理: G 相应的拉普拉斯矩阵(度矩阵 - 邻接矩阵)L( G )   删除随意一行一列得到的行列式的值det( L*( G ) ) 即生成树的个数,即spanning_trees_num( G ) = det( L*( G ) ) 证: 归纳如果 spanning_trees_num( G - e ) = de

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\i

【BZOJ4031】[HEOI2015]小Z的房间 矩阵树定理

[BZOJ4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. 你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把房子给打穿,或者打通柱子(以及柱子旁边的墙).同时,你不希望在房子中有小偷的时候会很难抓,所以你希望任意两个房间之间都只有一条通路.现在,你希望统计一共有多少种可行的方案.

【bzoj2467】[中山市选2010]生成树 矩阵树定理

题目描述 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的顶点.如图0所示是一个4-五角形圈. 现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目.还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树. 注意:在给定的n五角形圈中所有顶点均视为不同的顶点. 输入 输入包含多