• 学习笔记::矩阵树定理


    我很懒惰,没有理解

    是这样做的

    先计算每个点的度数

    a[i][j]=i到j边数*-1

    进行高斯消元

    最后把对角线乘起来就是答案

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    #define eps 1e-9
    #define N 20
    int n,m;
    int d[N][N],c[N][N];
    double a[N][N];
    void gauss()
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=i;j<=n+1;j++)
            {
                if(j==n+1)
                {
                    printf("0
    ");
                    return;
                }
                if(fabs(a[j][i])>eps)
                {
                    for(int k=i;k<=n;k++) swap(a[j][k],a[i][k]);
                    break;
                }
            }
            for(int j=i+1;j<=n;j++)
            {
                double t=a[j][i]/a[i][i];
                for(int k=1;k<=n;k++) a[j][k]=a[j][k]-t*a[i][k];
            }
        }
        double ans=1;
        for(int i=1;i<=n;i++) ans*=a[i][i];
        printf("%.0lf
    ",abs(ans));
    }
    int main()
    {
        int T; scanf("%d",&T);
        while(T--)
        {
            memset(d,0,sizeof(d));
            memset(c,0,sizeof(c));
            memset(a,0,sizeof(a));
            scanf("%d%d",&n,&m);
            n--;
            for(int i=1;i<=m;i++)
            {
                int u,v; scanf("%d%d",&u,&v);
                d[u][u]++; d[v][v]++;
                c[u][v]++; c[v][u]++;
            }
            for(int i=1;i<=n;i++) 
                for(int j=1;j<=n;j++) a[i][j]=d[i][j]-c[i][j];
            gauss();
        }
        return 0;
    }
    View Code
  • 相关阅读:
    U3D shaderlab 相关指令开关
    CCF NOI1073
    CCF NOI1185
    CCF NOI1077(自然数的拆分问题 )
    CCF NOI1070(汉诺塔)
    CCF NOI1069
    2018年全国多校算法寒假训练营练习比赛(第一场)G.圆圈
    poj1941(递归)
    Codeforce914B (Conan and Agasa play a Card Game)
    Codeforce916B
  • 原文地址:https://www.cnblogs.com/19992147orz/p/6349090.html
Copyright © 2020-2023  润新知