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));}