spoj highways(生成树计数)

最简单的那个模板题,这个题spoj有两个同名的,该代码为输入第一行为4那个
两个模板

//这个det函数有点不好用
#include
#include
#include
#include
using namespace std;
const int MAX=20;


double deg[MAX];
double g[MAX][MAX];
double b[MAX][MAX];

double Det(int n){
    int i,j,k;
    int sign=0;
    double ret=1;
    for(i=1;i<=n;i++){
        if(!b[i][i]){  //如果该点未被连接
            j=i+1;
            while(!b[j][i]&&j<=n){//找不为0的一行替换
                j++;
            }
            if(j>n)return 0;//如果大于n,说明对角线一定有一个0,
            for(k=i;k<=n;k++){
                swap(b[i][k],b[j][k]);  //换列
            }
            sign++;

        }
        if(!b[i][i]) return 0;

        ret*=b[i][i];

        for(j=i+1;j<=n;j++){        //处理矩阵
            double tmp=b[j][i]/b[i][i];
            for(k=i+1;k<=n;k++){
                b[j][k]-=tmp*b[i][k];
            }
        }

    }
    if(sign&1) ret=-ret;
   // cout << sign << endl;

    return ret;

}

int main()
{
    int T,n,m;
    int u,v;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        memset(deg,0,sizeof(deg));
        memset(g,0,sizeof(g));
        memset(b,0,sizeof(b));
        while(m--){
            scanf("%d%d",&u,&v);
            g[u][v]=1;g[v][u]=1;  //存入邻接矩阵
            deg[u]++; deg[v]++;     //计算度数
        }
        for(int i=1;i<=n;i++){
            b[i][i]=deg[i];     //建立度数矩阵
    //        cout << b[i][i] << endl;
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                b[i][j]-=g[i][j];  //把邻接矩阵减到度数矩阵中,负数方便分辨是邻接矩阵还是度数矩阵
            }
        }                   //下面注释的部分可以打印出矩阵

        /*for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                printf(" %.0lf",b[i][j]);
            }puts("");
        }*/

        printf("%.2lf\n",Det(n-1));//传入的是n-1,任意n-1阶就行
    }
return 0;
}

下面这个转自http://blog.csdn.net/jarily/article/details/8901363

#include
#include
#include
#include
#include
using namespace std;

const int N=15;

typedef long long LL;

int degree[N];
LL C[N][N];

LL det(LL a[][N],int n)//生成树计数:Matrix-Tree定理
{
    LL ret=1;
    for(int i=1; i

你可能感兴趣的:(spoj highways(生成树计数))