1. 程式人生 > >生成樹計數(Matrix-Tree定理)

生成樹計數(Matrix-Tree定理)

以下轉載自http://blog.csdn.net/jarily/article/details/8901363

/*
 *演算法引入:
 *給定一個無向圖G,求它生成樹的個數t(G);
 *
 *演算法思想:
 *(1)G的度數矩陣D[G]是一個n*n的矩陣,並且滿足:當i≠j時,dij=0;當i=j時,dij等於vi的度數;
 *(2)G的鄰接矩陣A[G]是一個n*n的矩陣,並且滿足:如果vi,vj之間有邊直接相連,則aij=1,否則為0;
 *定義圖G的Kirchhoff矩陣C[G]為C[G]=D[G]-A[G];
 *Matrix-Tree定理:G的所有不同的生成樹的個數等於其Kirchhoff矩陣C[G]任何一個n-1階主子式的行列式的絕對值;
 *所謂n-1階主子式,就是對於r(1≤r≤n),將C[G]的第r行,第r列同時去掉後得到的新矩陣,用Cr[G]表示;
 *
 *Kirchhoff矩陣的特殊性質:
 *(1)對於任何一個圖G,它的Kirchhoff矩陣C的行列式總是0,這是因為C每行每列所有元素的和均為0;
 *(2)如果G是不連通的,則它的Kirchhoff矩陣C的任一個主子式的行列式均為0;
 *(3)如果G是一顆樹,那麼它的Kirchhoff矩陣C的任一個n-1階主子式的行列式均為1;
 *
 *演算法舉例:
 *SPOJ104(Highways)
 *
 *題目地址:
 *http://www.spoj.com/problems/HIGH/
 *
 *題目大意:
 *一個有n座城市的組成國家,城市1至n編號,其中一些城市之間可以修建高速公路;
 *需要有選擇的修建一些高速公路,從而組成一個交通網路;
 *計算有多少種方案,使得任意兩座城市之間恰好只有一條路徑;
**/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
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<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 tcase;
    scanf("%d",&tcase);
    while(tcase--)
    {
        memset(degree,0,sizeof(degree));
        memset(C,0,sizeof(C));
        int n,m;
        scanf("%d%d",&n,&m);
        int u,v;
        while(m--)
        {
            scanf("%d%d",&u,&v);
            u--;
            v--;
            C[u][v]=C[v][u]=-1;
            degree[u]++;
            degree[v]++;
        }
        for(int i=0; i<n; ++i)
            C[i][i]=degree[i];
        printf("%lld\n",det(C,n));
    }
    return 0;
}


相關推薦

成樹計數Matrix-Tree定理

以下轉載自http://blog.csdn.net/jarily/article/details/8901363 /* *演算法引入: *給定一個無向圖G,求它生成樹的個數t(G); * *演算法思想: *(1)G的度數矩陣D[G]是一個n*n的矩陣,並且滿足:

spoj 104 HighwaysMatrix-tree定理

www. nbsp clu tree tex frame 無向圖 之間 tom spoj 104 Highways 生成樹計數,matrix-tree定理的應用。 Matrix-tree定理: D為無向圖G的度數矩陣(D[i][i]是i的度數,其他的為0)

BZOJ1494: [NOI2007]成樹計數Berlekamp-Massey演算法

傳送門 題解: 直接打表+BM算出遞推式,BM具體實現可以戳這裡 附上一份其醜無比的BM程式碼: const int L=4e2; namespace bm { int cnt,a[N],fail[N],delta[N]; vector <int> R[N]

2018.09.22【JSOI2008】【BZOJ1016】最小生成樹計數矩陣樹定理並查集

傳送門 解析: 好的這是一道需要數學推理的矩陣樹題目。 首先我們考慮一個問題。 前置定理 我們先隨便做一棵最小生成樹。 重要定理:那麼在這棵生成樹中如果權值為www的邊有ttt條,那麼在所有最小生成樹中,權值為www的邊都有kkk條。 證明如下: 考慮在這棵

最小生成樹計數Kruskal+Matrix-Tree定理

以下轉載自:http://blog.csdn.net/jarily/article/details/8902402 /* *演算法引入: *給定一個含有N個結點M條邊的無向圖,求它最小生成樹的個數t(G); * *演算法思想: *拋開“最小”的限制不看,如果只要

洛谷4208 JSOI2008最小生成樹計數矩陣樹定理+高斯消元

order code ace 才會 red sin 出現 span 進行 qwq 這個題目真的是很好的一個題啊 qwq 其實一開始想這個題,肯定是無從下手。 首先,我們會發現,對於無向圖的一個最小生成樹來說,只有當存在一些邊與內部的某些邊權值相同的時候且能等效替代的時候,才

hdu4305Lightning 成樹計數基爾霍夫矩陣+高斯消元+逆元

題意:比較裸的生成樹計數問題。   如何處理生成樹計數問題? 基爾霍夫矩陣: if i==j  Kir[i][j] = i的度數 if i!=j   Kir[i][j] = i到j的平行邊的個數的負數 即,基爾霍夫矩陣 = 度數矩陣 - 鄰接矩陣 將基爾霍夫矩陣刪去第i

【BZOJ1494】【NOI2007】成樹計數動態規劃,矩陣快速冪

題面 Description 最近,小棟在無向連通圖的生成樹個數計算方面有了驚人的進展,他發現: ·n個結點的環的生成樹個數為n。 ·n個結點的完全圖的生成樹個數為n^(n-2)。這兩個發現讓小棟欣喜若狂,由此更加堅定了他繼續計算生成樹個數的 想法,他

生成成樹計數 --- Matrix-Tree定理(基爾霍夫矩陣樹定理)

模板題點這 題目大意: *一個有n座城市的組成國家,城市1至n編號,其中一些城市之間可以修建高速公路; *需要有選擇的修建一些高速公路,從而組成一個交通網路; *計算有多少種方案

成樹計數-Matrix-Tree定理

/* *演算法引入: *給定一個無向圖G,求它生成樹的個數t(G); * *演算法思想: *(1)G的度數矩陣D[G]是一個n*n的矩陣,並且滿足:當i≠j時,dij=0;當i=j時,dij等於vi的度數; *(2)G的鄰接矩陣A[G]是一個n*n的矩陣,並且滿

UVA10766(Organising the Organisation)成樹計數-Matrix-Tree定理

/* *題目地址: *http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1707; * *題目大意:

BZOJ.1016.[JSOI2008]最小生成樹計數(Matrix Tree定理 Kruskal)

main mat 計算 def tdi str 題目 matrix include 題目鏈接 最小生成樹有兩個性質: 1.在不同的MST中某種權值的邊出現的次數是一定的。 2.在不同的MST中,連接完某種權值的邊後,形成的連通塊的狀態是一樣的。 \(Solution1\)

成樹計數及應用 Matrix-Tree

log blog 生成樹計數 mathjax 插值 tps 生成樹 www. 應用 例:給定一個圖,圖上每條邊是紅色或藍色,求恰有 k 條紅邊的生成樹個數. n≤50. Matrix-Tree定理,對於限制條件可以利用多項式,把紅邊邊權設為 X,藍邊為1. 最後求行列式得到

最小生成樹計數MST kruskal&矩陣定理

參考的有這位大佬的部落格:https://blog.csdn.net/clover_hxy/article/details/69397184 最小生成樹的兩個性質:  (1)不同的最小生成樹中,每種權值的邊出現的個數是確定的  (2)不同的生成樹中,某一種權值的邊連線完成後,

2019.01.02 bzoj2467: [中山市選2010]成樹矩陣樹定理

傳送門 矩陣樹定理模板題。 題意簡述:自己看題面吧太簡單懶得寫了 直接構建出這 4 n

kuangbin專題八 UVA10766 成樹計數Organising the Organisation請無視這篇文章

題意: 給出n,m,k,代表一家公司有n個部門,編號1到n,有m組關係,表示i和j不能直接聯通,k代表主管部門,問你有多少種分層方案。另外,這道題的k可以忽略掉,所以他的範圍完全是嚇唬人的。 題解: 抱歉,這道題我真的無法弄的通俗的說出來

kuangbin專題八 URAL1627 Join成樹計數

題意: 給出一個圖,’.’表示臥室,’*’表示儲藏間,每個格子上下左右都有一堵牆,然後需要打通一些臥室的牆(只能是相鄰房間才能打通)使得臥室之間聯通的方案數. 給每個臥室編個號,給可以打通的臥室加邊,就是裸的生成樹計數了. 題解: 打通一

UVA 10766 Organising the Organisation成樹計數 不取模

Problem H Organising the Organisation Input: Standard Input Output: Standard Output Time Limit: 2 Second I am the chief of the Personne

Matrix-Tree定理sx之前填坑還來得及嗎

從入門到入土:矩陣樹Matrix-Tree定理 參考blog 在正式介紹Matrix_Tree定理之前,我們需要一些前置知識 一些定義與定理 對於一個無向圖GG,ta的生成樹個數等於其基爾霍夫Kirchhhoff矩陣任何一個N−1N−1階主子式的行

最大成樹poj2377 和最小生成樹一個原理,只是排序的時候要降序排列

#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn=1000+10; const int maxm=20000+10; struc