UVA 10766(Organising the Organisation-补图生成树计数)
补图生成树计数。
注意重边。
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<iomanip> #include<cctype> #include<ctime> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (x<<1) #define Rson ((x<<1)+1) #define MEM(a) memset(a,0,sizeof(a)); #define MEMI(a) memset(a,127,sizeof(a)); #define MEMi(a) memset(a,128,sizeof(a)); #define eps (1e-10) #define MAXN (55) #define MAXM (50*50+10) #define MAXK (1500+10) typedef long long ll; typedef long double ld; int sgn(ld x){ if (fabs(x)<eps) return 0; else if (x>0) return 1; return -1; } struct M { int n,m; ll a[MAXN][MAXN]; M(int _n=0){n=m=_n;MEM(a);} M(int _n,int _m){n=_n,m=_m;MEM(a);} void mem (int _n=0){n=m=_n;MEM(a);} void mem (int _n,int _m){n=_n,m=_m;MEM(a);} void pri() { For(i,n) { For(j,m) cout<<a[i][j]<<' ';cout<<endl; } } friend M operator*(M a,M b) { M c; For(k,a.m) For(i,a.n) For(j,b.m) c.a[i][j]+=a.a[i][k]*b.a[k][j]; return c; } friend M operator-(M a,M b) { For(i,a.n) For(j,a.m) a.a[i][j]=a.a[i][j]-b.a[i][j]; return a; } void make_I(int _n) { n=m=_n; MEM(a) For(i,n) a[i][i]=1; } // 求行列式 long double mat[MAXN][MAXN],tmp[MAXN]; long double det() { long double ans=1; For(i,n) For(j,m) mat[i][j]=a[i][j]; For(i,n) { int pos=i; while (fabs(mat[pos][i])<eps&&pos<n) ++pos; if (fabs(mat[pos][i])<eps) return 0; if (pos^i) { copy(mat[pos]+1,mat[pos]+1+m+1,tmp+1); copy(mat[i]+1,mat[i]+1+m+1,mat[pos]+1); copy(tmp+1,tmp+1+m+1,mat[i]+1); } ans*=mat[i][i]; Fork(j,i+1,n) { long double p = mat[j][i]/mat[i][i]; Fork(k,i,m) mat[j][k]-=mat[i][k]*p; } } return ans; } }A,C,D; int n,m,k; int f[MAXN][MAXN]; void Kirchhoff() { while (~scanf("%d%d%d",&n,&m,&k)) { A.mem(n),D.mem(n); For(i,n) D.a[i][i]=n-1; For(i,n) For(j,n) if (i^j) A.a[i][j]=1; MEM(f) For(i,m) { int u,v; scanf("%d%d",&u,&v); f[u][v]=f[v][u]=1; } For(i,n) Fork(j,i+1,n) { if (f[i][j]) { D.a[i][i]--;D.a[j][j]--; A.a[i][j]--;A.a[j][i]--; } } C=D-A;C.n--;C.m--; // C.pri(); double ans=C.det(); printf("%.0lf\n",ans); } } int main() { // freopen("uva10766.in","r",stdin); Kirchhoff(); return 0; }