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];
bool can[51][51];
int main()
{
    int n,m,k,u,v;
    LL t,ans;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        memset(C,0,sizeof(C));
        memset(can,false,sizeof(can));
        while(m--)
        {
            scanf("%d%d",&u,&v);
            can[u][v]=can[v][u]=true;
        }
        for(int i=1;i<n;i++)
            for(int j=i+1;j<=n;j++)
                if(!can[i][j])
                {
                    C[i-1][j-1]=C[j-1][i-1]=-1;
                    C[i-1][i-1]++;
                    C[j-1][j-1]++;
                }
        ans=1;
        for(int i=1;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
                while(C[j][i])
                {
                    t=C[i][i]/C[j][i];
                    for(int k=i;k<n;k++) C[i][k]-=C[j][k]*t;
                    for(int k=i;k<n;k++) swap(C[i][k],C[j][k]);
                    ans=-ans;
                }
            ans*=C[i][i];
            if(!ans) break;
        }
        if(ans<0) ans=-ans;
        printf("%lld\n",ans);
    }
}
时间: 2024-10-23 18:08:35

UVA 10766 Organising the Organisation的相关文章

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的不同生成树的个数等于其

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

生成树的计数(基尔霍夫矩阵):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

kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一个环,如果还要维护处树的特点 那么就要在这个环上删去一条边,这样他还是树,删掉的边显然是这条链上权值最大边更可能形成次小生成树.那么就有2中方法可以做. 第一种PRIM在prim时候直接可以做出这个从I到J的链上权值最大的值MAX[i][j]; 同时可以用kruskal同样方式标记树边,然后DFS跑

[kuangbin带你飞]专题六 生成树

A. POJ 1679  The Unique MST 题意:最小生成树是不是唯一的. 思路:参考http://www.cnblogs.com/onlyAzha/p/4793031.html B. HDU 4081  Qin Shi Huang's National Road System 题意:秦始皇想要在城市之间修路.徐福可以用法力帮助他修一条路.秦始皇希望修一条路使得剩下的路需要的花费B最少,而徐福希望这条路所连的两个城市的人口数之和A最大.权衡后他们决定选择A/B的值最大的边来修建. 思

UVA 562 Dividing coins --01背包的变形

01背包的变形. 先算出硬币面值的总和,然后此题变成求背包容量为V=sum/2时,能装的最多的硬币,然后将剩余的面值和它相减取一个绝对值就是最小的差值. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 50007 int c[102],d

UVA 10341 Solve It

Problem F Solve It Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB Solve the equation: p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0 where 0 <= x <= 1. Input Input consists of multiple test cases and te

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f