zoukankan      html  css  js  c++  java
  • Matrix-tree定理 spoj HIGH

    Matrix-tree定理,给出一个无向图,问求出的生成树方案有多少种方案,利用Matrix-tree定理,主对角线第i行是i的度数,(i,j) 值为i和j之间边的数量,然后删去第一行第一列,利用初等变换求出行列式的绝对值就是答案。

    附上代码——by VANE

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int n;
    ll c[13][13],tmp[13];
    int main()
    {
        int T,m,u,v;
        ll t,ans;
        scanf("%d",&T);
        while(T--)
        {
            memset(c,0,sizeof c);
            scanf("%d%d",&n,&m);
            while(m--)
            {
                scanf("%d%d",&u,&v);
                u--;v--;
                c[u][v]--;c[v][u]--;
                c[u][u]++;c[v][v]++;
            }
            ans=1;
            for(int i=1;i<n;++i)
            {
                for(int j=i+1;j<n;++j)
                while(c[j][i])
                {
                    t=c[i][i]/c[j][i];
                    for(int k=i;k<n;++k) c[i][k]-=c[j][k]*t;
                    for(int k=i;k<n;++k) swap(c[i][k],c[j][k]);
                    ans=-ans;
                }
                ans*=c[i][i];
                if(!ans) break;
            }
            ans=max(ans,-ans);
            printf("%lld
    ",ans);
        }
    }

     UPD:对于有向图而言

    1、无向图中是双向边,所以一条边(u,v)会使度数矩阵的(u;u)和(v;v)元都加一,现 在变成有向图,只让其中一个加一即可。

    2、同理,邻接矩阵也从(u;v)元和(v;u)加一变成其中一个加一。  

    3、基尔霍夫矩阵还是度数减邻接。 

    4、无向图是任意删去一行一列,有向图中是删除“根节点”所在行列求 行列式。

  • 相关阅读:
    做了一些心理学的测试,分析下个人
    做了一些心理学的测试,分析下个人
    逆转一个整数
    打印九九乘法表
    计算两个日期相差多少天
    struct的使用
    Linux Vim替换字符串的一些方法小结
    CentOS里vim基本操作
    如何创建一个后台进程
    高中是个把人分类的机器(转)
  • 原文地址:https://www.cnblogs.com/nbwzyzngyl/p/8035005.html
Copyright © 2011-2022 走看看