關聯矩陣、相鄰矩陣、生成樹、環路空間、斷集空間的求解
實驗題目:關聯矩陣、相鄰矩陣、生成樹、環路空間、斷集空間的求解
實驗目的:
1、掌握無向連通圖生成樹的求解方法;
2、掌握基本回路系統和環路空間的求解方法;
3、掌握基本割集系統和斷集空間的求解方法;
4、瞭解生成樹、環路空間和斷集空間的實際應用。
實驗要求:
1、給定無向簡單連通圖的相鄰矩陣(例如:)。
1、輸出此圖的關聯矩陣M。
2、求此圖所有生成樹個數。
3、輸出其中任意一顆生成樹的相鄰矩陣(預設第i行對應頂點vi)和關聯矩陣(預設第i行對應頂點vi,第j列對應邊ej)。
4、求此生成樹對應的基本回路系統(輸出形式如:{e1e4e3,e2e5e3})。
5、求此生成樹對應的環路空間(輸出形式如:
6、求此生成樹對應的基本割集系統(輸出形式如:{{e1,e4},{e2,e5},{e3,e4,e5}})。
7、求此生成樹對應的斷集空間(輸出形式如:{, {e1,e4}, {e2,e5}, {e3,e4,e5}, {e1,e2,e4,e5}, {e1,e3,e5}, {e2,e3,e4}, {e1,e2,e3}})。
*說明:要求學生設計的程式不僅對給定相鄰矩陣得出正確結果,還要對教師測試資料集得出正確結果。
實驗內容和實驗步驟:(由學生填寫)
輸入:第一行一個整數n,代表有n階
接下來n行每行n個整數為鄰接矩陣
輸出:輸出該圖每條邊連線的兩個點
輸出該圖中的關聯矩陣
輸出生成樹的個數
輸出一棵生成樹的相鄰矩陣
輸出一棵生成樹的關聯矩陣
輸出生成樹的基本回路系統
輸出生成樹的環路空間
輸出生成樹的基本割集系統
輸出生成樹的斷集空間
1.求給定鄰接矩陣的關聯矩陣,遍歷鄰接矩陣中各點,若為a[i][j]==1則申請一條邊連通i,j,將其加入到關聯矩陣中,同時將第m條邊連線的兩點記錄到edge【m】【1】,edge【m】【2】中為後面使用鋪墊。在程式碼中trans()函式實現。
2.求生成樹個數,參考網路上基爾霍夫矩陣,A-B=C,A代表度數方程,B代表鄰接矩陣,C代表基爾霍夫矩陣。矩陣樹定理為將基爾霍夫矩陣去掉一行一列後求得的行列式結果為生成樹個數。在程式碼中countt()函式實現。
3.找一個最小生成樹。用克魯斯卡爾並查集的方式,首先將每個點fa賦值為自己,然後遍歷每條邊,如果連線的兩點fa不同,說明不在同一個塊上,可以連邊。如果兩點fa相同,說明兩點在同一棵樹上,繼續連邊的話會破壞樹形結構。在確定連邊的過程中可以同時計算生成樹的鄰接矩陣,同時對每條邊記錄scedge【m】【1】和scedge【m】【2】,m為生成樹上的邊。在程式碼中sctree()函式實現。
4.找基本回路系統,對於不在生成樹上的邊,先將該邊加入一條基本回路中,然後對於該邊連線的兩點x和y,使用之前預備好的edge陣列可以很容易的得到。然後在樹上dfs查詢從x到y的一條路徑,該路徑是存在且唯一的。對於每條弦,重複以上操作。在程式碼中basecircle()函式實現。
5.求環路空間。環路空間由基本回路和其環合運算組成。
在上一步中我們已經求出基本回路系統,並得到矩陣,第1行表示第一條基本回路由第一三四條邊組成。那麼對兩條邊環合運算實際上可以看成是判斷同一條邊是否重否出現奇數次,若是奇數次則可以保留。於是使用val陣列來進行記錄累計值。選擇拿些邊羅列所有情況是一件困難的是,容易知道對L條邊每條邊選或不選有兩種情況,那麼一共有2的L次種情況,及sx種情況。從0到sx-1的每個數字恰好能表示一種選擇狀態,其二進位制的每一位為0或1恰好可以表示對應的基本回路選或不選。於是可以得到所有可能。
6.求基本割集系統。使用並查集的思想,對於樹上的一條邊i,對樹上除去i的邊連線的兩點做並查集的合併,最後該樹會被分為兩部分。然後再對於弦,看其連線的兩點x,y是否在同一塊上,即他們的fa是否相等。如果不在則可加入到該基本割集中。對於樹上的每條邊做重複操作,最終生成基本割集系統。
7.斷集空間。用基本割集做環合運算,過程與以上從4到5的過程相似。