也許有許多人像我一樣,一開始用鄰接表做這題,結果發現深搜的順序是錯的導致這題出不來。很多人於是放棄了鄰接表,利用鄰接矩陣,顯然方便很多。但我不信這個邪,咱就一起死磕這題!
先來看看為什麼會錯。其實你發現深搜是沒有問題的,本來深搜就不是唯一的,所以我們的深搜和答案僅僅是順序不一樣而已。
那麼答案的順序是怎樣的呢?題目中有「假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點」,顯然是按序號從大到小訪問頂點。
由於我們是臨界表,各個頂點的連線關係可以看作是單鏈表來實現的,這就要求我們每個頂點後的單鏈表是遞增排序。然鵝我們建立單鏈表的時候是讀到兩個頂點,利用前插法在這兩個頂點後分別接上另乙個頂點。顯然輸入不是按照遞增順序,這就導致我們為每個頂點建立的單鏈表不是遞增,從而不能滿足「按編號遞增的順序訪問鄰接點」。
好啦,明白問題後,我們想想解決方法。
既然是要死磕鄰接表,那麼這個儲存結構就不變了。想要鄰接表做到「按編號遞增的順序訪問鄰接點」,想來也不難,就是讓每個頂點後的單鏈表按遞增順序排列。
最後一步,讓單鏈表遞增排列,那麼就只有兩種方法了:
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...