UVA-10766 Organising the Organisation
阿新 • • 發佈:2018-11-02
生成樹計數模板題
發現這個的模板有很多種,有的套上來時WA,有的能AC
因為自己不懂怎麼求行列式,看不出有什麼問題,趕緊補習一下
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int N=50+10; ll a[N][N],b[N][N]; ll det(int n) { ll ret=1; for(int i=0;i<n;i++) for(int j=0;j<n;j++) b[i][j]=a[i][j]; for(int i=0;i<n;i++) { if(b[i][i]==0) { int j; for(j=i+1;j<n;j++) if(b[j][i]!=0) break; if(j==n) return -1; for(int k=i;k<n;k++) swap(b[j][k],b[i][k]); ret=-ret; } for(int j=i+1;j<n;j++) { while(b[j][i]) { ll t=b[i][i]/b[j][i]; for(int k=i;k<n;k++) { b[i][k]-=t*b[j][k]; swap(b[i][k],b[j][k]); } ret=-ret; } } ret*=b[i][i]; } return ret; } bool g[N][N]; int main() { int n,m,k; while(~scanf("%d%d%d",&n,&m,&k)) { int u,v; memset(g,true,sizeof(g)); for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); u--;v--; g[u][v]=g[v][u]=false; } for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]=0; for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) if(g[i][j]) { a[i][i]++; a[j][j]++; a[i][j]=a[j][i]=-1; } printf("%lld\n",det(n-1)); } return 0; }