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
",ans);    
    }
}
原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7418326.html