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[][];
bool can[][];
int main()
{
int n,m,k,u,v;
LL t,ans;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
memset(C,,sizeof(C));
memset(can,false,sizeof(can));
while(m--)
{
scanf("%d%d",&u,&v);
can[u][v]=can[v][u]=true;
}
for(int i=;i<n;i++)
for(int j=i+;j<=n;j++)
if(!can[i][j])
{
C[i-][j-]=C[j-][i-]=-;
C[i-][i-]++;
C[j-][j-]++;
}
ans=;
for(int i=;i<n;i++)
{
for(int j=i+;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<) ans=-ans;
printf("%lld\n",ans);
}
}