SP104 HIGH - Highways
Matrix Tree 定理 模板,行列式的值用高斯消元
代码
#include<bits/stdc++.h>
#define LL long long
#define int LL
using namespace std;
const int MAXN = 1005;
const double eps = 1e-7;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
return x*f;
}
int n,m,T,is[MAXN];
int du[MAXN][MAXN];
int a[MAXN][MAXN];
double ans[MAXN][MAXN];
LL ANS=1;
inline void gauss(int n){
double ret=1;
int h=1,l=1;
for(;h<=n && l<=n;h++,l++){
int r=h;
for(register int i=h+1;i<=n;i++)
if(fabs(ans[i][l])>fabs(ans[r][l])) r=i;
if(fabs(ans[r][l])<eps) {h--;continue;}
if(r!=h){
for(register int i=l;i<=n;i++)
swap(ans[h][i],ans[r][i]);
ret=-ret;
}
for(register int i=h+1;i<=n;i++)
if(fabs(ans[i][l])>eps){
double tmp=ans[i][l]/ans[h][l];
for(register int j=l+1;j<=n;j++)
ans[i][j]-=tmp*ans[h][j];
ans[i][l]=0;
}
}
// for(register int i=1;i<=n;i++){
// for(register int j=1;j<=n;j++)
// cout<<ans[i][j]<<" ";
// cout<<endl;
// }
for(register int i=1;i<=n;i++)
ret*=ans[i][i];
printf("%lld\n",(LL)(fabs(ret)));
}
signed main(){
T=rd();
while(T--){
n=rd();m=rd();
ANS=1;
for(register int i=1;i<=n;i++)
for(register int j=1;j<=n;j++)
ans[i][j]=du[i][j]=a[i][j]=0;
for(register int i=1;i<=m;i++){
int x,y;
x=rd();y=rd();
a[x][y]++;a[y][x]++;
du[x][x]++;du[y][y]++;
}
for(register int i=1;i<=n;i++)
for(register int j=1;j<=n;j++)
ans[i][j]=du[i][j]-a[i][j];
// for(register int i=1;i<=n;i++){
// for(register int j=1;j<=n;j++)
// cout<<ans[i][j]<<" ";
// cout<<endl;
// }
gauss(n-1);
}
return 0;
}