1 条题解
-
0
入度矩阵对应的外向树,出度矩阵对应着内向树(都是指向父亲的边的是出度或者入度)
无根树就是两条有向边都加上
有向树必须删掉根所在的那一行和一列,无根树可以任意
然后对于这n−1阶的矩阵求一个行列式就行了,也叫主子式#include<bits/stdc++.h> using namespace std; void read(int&x) { x=0;int w=1;char ch=getchar(); for(; !isdigit(ch); ch=getchar())if(ch=='-') w=-w; for(; isdigit(ch); ch=getchar()) x=x*10+ch-'0'; x*=w; } const int mod=1e4+7; int fpow(int x,int k) { int ans=1; for(; k; k>>=1,x=x*x%mod) if(k&1) ans=ans*x%mod; return ans; } int A[255][255]; int gauss(int n) { int p=1; for(int i=1; i<n; i++) { int k=i; for(int j=i+1; j<=n; j++) if(A[j][i]>A[k][i]) k=j; if(k!=i) swap(A[k],A[i]),p*=-1; if(!A[i][i]) return 0; int inv=fpow(A[i][i],mod-2); for(int j=i+1; j<=n; j++) { int coef=A[j][i]*inv%mod; for(int k=i; k<=n; k++) A[j][k]=(A[j][k]+mod-coef*A[i][k]%mod)%mod; } } if(p<0) p+=mod; for(int i=1; i<=n; i++) p=p*A[i][i]%mod; return p; } int main() { int n,m; read(n),read(m); for(int x,y; m--;) { read(x),read(y); // y->x --A[y-1][x-1],++A[x-1][x-1]; } for(int i=0; i<n; i++)for(int j=0; j<n; j++) if(A[i][j]<0) A[i][j]+=mod; printf("%d\n",gauss(n-1)); return 0; }
- 1
信息
- ID
- 1333
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 8
- 标签
- 递交数
- 234
- 已通过
- 28
- 上传者