生成树计数模板

#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<cmath>  
#include<algorithm>  
using namespace std;  
  
const int N=55;  
  
typedef long long LL;  
  
int D[N][N];  
LL C[N][N];//Kirchhoff矩阵  
  
LL Det(LL a[][N],int n)//生成树计数:Matrix-Tree定理  
{  
    LL ret=1;  
    for(int i=1; i<n; i++)  
    {  
        for(int j=i+1; j<n; j++)  
            while(a[j][i])  
            {  
                LL t=a[i][i]/a[j][i];  
                for(int k=i; k<n; k++)  
                    a[i][k]=(a[i][k]-a[j][k]*t);  
                for(int k=i; k<n; k++)  
                    swap(a[i][k],a[j][k]);  
                ret=-ret;  
            }  
        if(a[i][i]==0)  
            return 0;  
        ret=ret*a[i][i];  
    }  
    if(ret<0)  
        ret=-ret;  
    return ret;  
}  
  
int main()  
{  
    //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);  
    int n,m,k;  
    while(~scanf("%d%d%d",&n,&m,&k))  
    {  
        memset(C,0,sizeof(C));  
        memset(D,0,sizeof(D));  
        int u,v;  
        while(m--)  
        {  
            scanf("%d%d",&u,&v);  
            u--;  
            v--;  
            D[u][v]=D[v][u]=1;  
        }  
        for(int i=0; i<n; i++)  
        {  
            int u=0;  
            for(int j=0; j<n; j++)  
            {  
                if(i!=j&&!D[i][j])  
                {  
                    u++;  
                    C[i][j]=-1;  
                }  
  
            }  
            C[i][i]=u;  
        }  
        LL res=Det(C,n);  
        printf("%lld\n",res);  
    }  
    return 0;  
}  
View Code

 

posted on 2015-08-03 16:40  onlyAzha  阅读(258)  评论(0编辑  收藏  举报

导航