產生樹計數

來源:互聯網
上載者:User

Matrix-Tree定理(Kirchhoff矩陣-樹定理)解決簡單平凡無向圖的產生樹計數問題最有力的武器之一

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]表示。

Cayley定理:完全圖的產生樹個數為n^(n-2).推論:有根完全圖的產生樹個數為n^(n-1)

long det(long[][] mat, int n) {long ans = 1;for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++)while (mat[i][j] != 0) {long t = mat[i][i] / mat[i][j];for (int k = 0; k < n; k++)mat[k][i] -= mat[k][j] * t;long temp;for (int k = 0; k < n; k++) {temp = mat[k][i];mat[k][i] = mat[k][j];mat[k][j] = temp;}ans = -ans;}if (mat[i][i] == 0)return 0;}for (int i = 0; i < n; i++)ans *=  mat[i][i];return ans;}void run() {int n = scan.nextInt();int m = scan.nextInt();long map[][] = new long[n][n];while (m-- > 0) {int a = scan.nextInt() - 1;int b = scan.nextInt() - 1;if (map[a][b] == -1)continue;map[a][b]--;map[b][a]--;map[a][a]++;map[b][b]++;}System.out.println(det(map, n - 1));}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.