模板—数学—矩阵树定理
Code:
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 1010
#define mod 1000000000
long long ans,squ[N][N];int n,m;
long long calc(int n)
{
long long tmp=1;
for(int i=1;i<n;i++)
{
int j; for(j=i;j<n;j++) if(squ[j][i]) break;
if(j==n) continue;
if(j!=i) {for(int k=i;k<n;k++) swap(squ[i][k],squ[j][k]);tmp*=-1;}
for(j=i+1;j<n;j++)
{
while(squ[j][i])
{
long long t=squ[j][i]/squ[i][i];
for(int k=i;k<n;k++) squ[j][k]=(squ[j][k]-squ[i][k]*t%mod+mod)%mod;
if(!squ[j][i]) break;
for(int k=i;k<n;k++) swap(squ[i][k],squ[j][k]); tmp*=-1;
}
}
}
for(int i=1;i<n;i++) (tmp*=squ[i][i])%=mod; return tmp;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1,x,y;i<=m;i++)
scanf("%d%d",&x,&y),squ[x][x]++,squ[y][y]++,squ[x][y]--,squ[y][x]--;
printf("%lld\n",calc(n));
}