1 条题解

  • 0
    @ 2025-10-8 16:56:28

    入度矩阵对应的外向树,出度矩阵对应着内向树(都是指向父亲的边的是出度或者入度)
    无根树就是两条有向边都加上
    有向树必须删掉根所在的那一行和一列,无根树可以任意
    然后对于这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
    上传者