列出連通集的鄰接表解題

2022-05-31 03:15:14 字數 2531 閱讀 9359

也許有許多人像我一樣,一開始用鄰接表做這題,結果發現深搜的順序是錯的導致這題出不來。很多人於是放棄了鄰接表,利用鄰接矩陣,顯然方便很多。但我不信這個邪,咱就一起死磕這題!

先來看看為什麼會錯。其實你發現深搜是沒有問題的,本來深搜就不是唯一的,所以我們的深搜和答案僅僅是順序不一樣而已。

那麼答案的順序是怎樣的呢?題目中有「假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點」,顯然是按序號從大到小訪問頂點。

由於我們是臨界表,各個頂點的連線關係可以看作是單鏈表來實現的,這就要求我們每個頂點後的單鏈表是遞增排序。然鵝我們建立單鏈表的時候是讀到兩個頂點,利用前插法在這兩個頂點後分別接上另乙個頂點。顯然輸入不是按照遞增順序,這就導致我們為每個頂點建立的單鏈表不是遞增,從而不能滿足「按編號遞增的順序訪問鄰接點」。

好啦,明白問題後,我們想想解決方法。

既然是要死磕鄰接表,那麼這個儲存結構就不變了。想要鄰接表做到「按編號遞增的順序訪問鄰接點」,想來也不難,就是讓每個頂點後的單鏈表按遞增順序排列。

最後一步,讓單鏈表遞增排列,那麼就只有兩種方法了:

1. 待單鏈表建立完後,對整個單鏈表進行排序

2. 在生成單鏈表的時候,按遞增順序確定插入結點位置後再插入

兩種方法都行的,只是多寫乙個介面的問題。為了避免建立完煉表後再對它進行一次迴圈,我選擇了第二種方法。

**

這是一開始的**。我們只需注意深搜的介面即可,其餘的作為解這題的參考。

1 #include 2 #include 3

4using

namespace

std;56

//採用鄰接表,一下為定義

7 typedef struct

arcnode arcnode;

11 typedef struct

vexnode vexnode,adjlist[10

];15 typedef struct

algraph;

1920

//函式宣告

21void create(algraph &g);

22void dfs(algraph g, int

v);23

void bfs(algraph g, int

v);24

25bool visited_dfs[10] = ;

26bool visited_bfs[10] = ;

2728

intmain()

"<

38}39//

輸出廣搜

40for (int i = 0; i < graph.vexnum; i++)

"<

46}47return0;

48}4950

//建立鄰接表

51void create(algraph &g)

59//

兩點確定一邊,前插法

60for (int i = 0; i < g.arcnum; i++)

71//

cout << "建立" << endl;72}

7374

//深搜

75void dfs(algraph g, int

v) 86 p = p->nextarc;87}

88}8990

//廣搜,引入佇列作為輔助

91void bfs(algraph g, int

v) 109 p = p->nextarc;

110}

111}

112 }

因為順序不對過不了

既然決定了要在插入的時候保持鍊錶的公升序,就寫出以下介面

1 arcnode* insert(arcnode *firstarc, arcnode *p) 

8 p1 =firstarc;9//

定位到要插入的位置

10while ((p->adjvex > p1->adjvex) && p1->nextarc !=null)

14if (p->adjvex < p1->adjvex)

19else 22}

23else

27return

firstarc;

28 }

公升序插入的介面

最後,在建立鍊錶的部分進行調整,注意這個部分前後的區別 

1

//建立鄰接表

2void create(algraph &g)

10//

兩點確定一邊,前插法

11for (int i = 0; i < g.arcnum; i++)

22//

cout << "建立" << endl;

23 }

修改建立鄰接表的介面

列出連通集

給定乙個有n個頂點和e條邊的無向圖,請用dfs和bfs分別列出其所有的連通集。假設頂點從0到n 1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。輸入第1行給出2個整數n 0按照 的格式,每行輸出乙個連通集。先輸出dfs的結果,再輸出bfs的結果。純dfs和bfs的練...

列出連通集

7 15 列出連通集 25 分 給定乙個有n個頂點和e條邊的無向圖,請用dfs和bfs分別列出其所有的連通集。假設頂點從0到n 1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。輸入格式 輸入第1行給出2個整數n 0輸出格式 按照 的格式,每行輸出乙個連通集。先輸出d...

列出連通集

7 6 列出連通集 25 分 給定乙個有n個頂點和e條邊的無向圖,請用dfs和bfs分別列出其所有的連通集。假設頂點從0到n 1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。輸入第1行給出2個整數n 0按照 的格式,每行輸出乙個連通集。先輸出dfs的結果,再輸出bf...