卧薪尝胆,厚积薄发。
CQOI2018 社交网络
Date: Wed Dec 12 17:34:58 CST 2018 In Category: NoCategory

Description:

求有向图以一为根的树形图个数。
$1\leqslant n\leqslant 250$

Solution:

如果是无向图有矩阵树定理,有向图就是入度矩阵减邻接矩阵的转置,以一为根就是去掉第一行第一列的行列式。

Code:


#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cctype>
#include<cstring>
using namespace std;
int n,m;
#define MAXN 251
int g[MAXN][MAXN];
#define MOD 10007
int power(int a,int b)
{
int res = 1;
while(b > 0)
{
if(b & 1)res = 1ll * res * a % MOD;
a = 1ll * a * a % MOD;
b = b >> 1;
}
return res;
}
int main()
{
scanf("%d%d",&n,&m);
int a,b;
for(int i = 1;i <= m;++i)
{
scanf("%d%d",&a,&b);
++g[a][a];--g[a][b];
}
int ans = 1;
for(int i = 2;i <= n;++i)
{
for(int j = i;j <= n;++j)
{
if(g[j][i] != 0)
{
if(j != i)
{
for(int l = i;l <= n;++l)swap(g[i][l],g[j][l]);
ans = 1ll * ans * (MOD - 1) % MOD;
}
break;
}
}
for(int j = i + 1;j <= n;++j)
{
int ratio = 1ll * g[j][i] * power(g[i][i],MOD - 2) % MOD;
for(int l = i;l <= n;++l)g[j][l] = (g[j][l] - 1ll * ratio * g[i][l] % MOD + MOD) % MOD;
}
}
for(int i = 2;i <= n;++i)ans = 1ll * ans * g[i][i] % MOD;
cout << ans << endl;
return 0;
}
Copyright © 2020 wjh15101051
ღゝ◡╹)ノ♡