日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

prufer序列

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 prufer序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

prufer數列

?編輯
本詞條缺少信息欄,補充相關內容使詞條更完整,還能快速升級,趕緊來編輯吧! Prufer數列是無根樹的一種數列。在組合數學中,Prufer數列由有一個對于頂點標過號的樹轉化來的數列,點數為n的樹轉化來的Prufer數列長度為n-2。它可以通過簡單的迭代方法計算出來。它由Heinz Prufer于1918年在證明cayley定理時首次提出。

目錄

  1. 1?將樹轉化成Prufer數列的方法
  2. 2?將Prufer數列轉化成樹的方法

將樹轉化成Prufer數列的方法

編輯 一種生成Prufer序列的方法是迭代刪點,直到原圖僅剩兩個點。對于一棵頂點已經經過編號的樹T,頂點的編號為{1,2,...,n},在第i步時,移去所有葉子節點(度為1的頂點)中標號最小的頂點和相連的邊,并把與它相鄰的點的編號加入Prufer序列中,重復以上步驟直到原圖僅剩2個頂點。 例子 Prufer數列 以右邊的樹為例子,首先在所有葉子節點中編號最小的點是2,和它相鄰的點的編號是3,將3加入序列并刪除編號為2的點。接下來刪除的點是4,5被加入序列,然后刪除5,1被加入序列,1被刪除,3被加入序列,此時原圖僅剩兩個點(即3和6),Prufer序列構建完成,為{3,5,1,3}

將Prufer數列轉化成樹的方法

編輯 設{a1,a2,..an-2}為一棵有n個節點的樹的Prufer序列,另建一個集合G含有元素{1..n},找出集合中最小的未在Prufer序列中出現過的數,將該點與Prufer序列中首項連一條邊,并將該點和Prufer序列首項刪除,重復操作n-2次,將集合中剩余的兩個點之間連邊即可。 例子 仍為上面的樹,Prufer序列為{3,5,1,3},開始時G={1,2,3,4,5,6},未出現的編號最小的點是2,將2和3連邊,并刪去Prufer序列首項和G中的2。接下來連的邊為{4,5},{1,5},{1,3},此時集合G中僅剩3和6,在3和6之間連邊,原樹恢復。 詞條標簽:
科學??學科
?

矩陣樹定理

?745人閱讀?評論(0)?收藏?舉報 ?分類: ?

摘要

?

?????? 在信息學競賽中,有關生成樹的最優化問題如最小生成樹等是我們經常遇到的,而對生成樹的計數及其相關問題則少有涉及。事實上,生成樹的計數是十分有意義的,在許多方面都有著廣泛的應用。本文從一道信息學競賽中出現的例題談起,首先介紹了一種指數級的動態規劃算法,然后介紹了行列式的基本概念、性質,并在此基礎上引入Matrix-Tree定理,同時通過與一道數學問題的對比,揭示了該定理所包含的數學思想。最后通過幾道例題介紹了生成樹的計數在信息學競賽中的應用,并進行總結。

關鍵字

?

?????? 生成樹的計數 Matrix-Tree定理

問題的提出

?

[例一]高速公路(SPOJ p104 Highways)

?

?????? 一個有n座城市的組成國家,城市1至n編號,其中一些城市之間可以修建高速公路?,F在,需要有選擇的修建一些高速公路,從而組成一個交通網絡。你的任務是計算有多少種方案,使得任意兩座城市之間恰好只有一條路徑?

?????? 數據規模:1≤n≤12。

[分析]

?

?????? 我們可以將問題轉化到成圖論模型。因為任意兩點之間恰好只有一條路徑,所以我們知道最后得到的是原圖的一顆生成樹。因此,我們的問題就變成了,給定一個無向圖G,求它生成樹的個數t(G)。這應該怎么做呢?

經過分析,我們可以得到一個時間復雜度為O(3n*n2)的動態規劃算法,因為原題的規模較小,可以滿足要求。但是,當n再大一些就不行了,有沒有更優秀的算法呢?答案是肯定的。在介紹算法之前,首先讓我們來學習一些基本的預備知識。

新的方法

?

介紹

?

?????? 下面我們介紹一種新的方法——Matrix-Tree定理(Kirchhoff矩陣-樹定理)。Matrix-Tree定理是解決生成樹計數問題最有力的武器之一。它首先于1847年被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]表示。

附程序:

#include<iostream>

??????#include<cmath>

using namespace std;

#define zero(x)((x>0? x:-x)<1e-15)

int const MAXN = 100;

double a[MAXN][MAXN];

?????? doubleb[MAXN][MAXN];

int g[53][53];

?????? int N, M;

double det(double a[MAXN][MAXN], int n) {

??? int i, j,k, sign = 0;

??? doubleret = 1, t;

??? for (i =0; i < n; i++)

??????? for(j = 0; j < n; j++)

???????????b[i][j] = a[i][j];

??? for (i =0; i < n; i++) {

??????? if(zero(b[i][i])) {

???????????for (j = i + 1; j < n; j++)

???????????????if (!zero(b[j][i]))

???????????????????break;

???????????if (j == n)

???????????????return 0;

???????????for (k = i; k < n; k++)

???????????????t = b[i][k], b[i][k] = b[j][k], b[j][k] = t;

???????????sign++;

??????? }

??????? ret*= b[i][i];

??????? for(k = i + 1; k < n; k++)

???????????b[i][k] /= b[i][i];

??????? for(j = i + 1; j < n; j++)

???????????for (k = i + 1; k < n; k++)

???????????????b[j][k] -= b[j][i] * b[i][k];

??? }

??? if (sign& 1)

??????? ret =-ret;

??? returnret;

}

int main() {

??? int cas;

???scanf("%d", &cas);

??? while (cas--) {

??????? scanf("%d%d", &N,&M);

??????? for (int i = 0;i < N; i++) {

???????????for (int j = 0; j < N; j++) {

??????????????

????????? ?????g[i][j] = 0;

??????????? }

??????? }

??????? while(M--) {

???????????int a, b;

???????????scanf("%d%d", &a, &b);

???????????g[a - 1][b - 1] = g[b - 1][a - 1] = 1;

??????? }

??????? for(int i = 0; i < N; i++) {

???????????for (int j = 0; j < N; j++) a[i][j] = 0;

??????? }

??????? for(int i = 0; i < N; i++) {

???????????int d = 0;

???????????for (int j = 0; j < N; j++) if (g[i][j]) d++;

???????????a[i][i] = d;

??????? }

??????? for(int i = 0; i < N; i++) {

???????????for (int j = 0; j < N; j++) {

???????????????if (g[i][j]) a[i][j] = -1;

??????????? }

??????? }

???????double ans = det(a, N - 1);

???????printf("%0.0lf\n", ans);

??? }

??? return 0;

}


總結

以上是生活随笔為你收集整理的prufer序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。