UVA 10766 Organising the Organisation

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);    
    }
}

 

以上是关于UVA 10766 Organising the Organisation的主要内容,如果未能解决你的问题,请参考以下文章

uva 10766 Organising the Organisation 生成树计数

uva10766生成树计数

uva10766生成树计数

Undraw the Trees UVA - 10562

UVA 811 The Fortified Forest (凸包 + 状态压缩枚举)

UVA Mapping the Swaps