給定乙個有n個頂點和e條邊的無向圖,請用dfs和bfs分別列出其所有的連通集。假設頂點從0到n−1編號。進行搜尋時,假設我們總是從編號最小的頂點出發,按編號遞增的順序訪問鄰接點。
輸入格式:
輸入第1行給出2個整數n(0輸出格式:
按照""的格式,每行輸出乙個連通集。先輸出dfs的結果,再輸出bfs的結果。
輸入樣例:
8 60 70 1
2 04 1
2 43 5
輸出樣例:
思路
這就是一道深度優先遍歷和廣度優先遍歷的題目。
因為此圖的頂點較少,可以使用鄰接矩陣儲存,並且不必要用動態矩陣。
在進行深度優先遍歷時,只需要用好visited陣列即可,保證下次迭代訪問的頂點不僅是此時的鄰接點,還要求沒有被訪問。
在進行廣度優先遍歷時,需要涉及到佇列的操作:建立乙個空隊、頂點入隊、頂點出隊、判斷隊是否為空。在這裡為了簡便起見,用陣列作為隊的構成方式,當然也可以用鍊錶。
廣度優先遍歷需要剛開始的時候就入隊乙個頂點,然後進入while迴圈,只要隊不空,這個迴圈一直做。迴圈內就是彈出佇列的乙個頂點,然後按照大小順序,遍歷此點的所有鄰接點,並把這些點入隊。
實現
#include
#include
#define maxn 10
#define infinity 100000
#define maxsize 10+1
typedef
int weighttype;
typedef
int vertex;
typedef
struct qnode *queue;
struct qnode
;typedef
struct gnode *ptrtognode;
typedef ptrtognode mgraph;
struct gnode
;typedef
struct enode *ptrtoenode;
typedef ptrtoenode edge;
struct enode
;mgraph creategraph
(int vertexnum)
void
insertedge
(mgraph graph, edge e)
mgraph buildgraph
(int vertexnum,
int edgenum)
return graph;
}void
visit
(vertex i)
int visited[maxn]=;
void
dfs(mgraph graph, vertex v,
void
(*visit)
(vertex))}
queue createqueue()
void
addq
(queue q, vertex v)
vertex deleteq
(queue q)
intisemptyq
(queue q)
void
bfs(mgraph graph, vertex v,
void
(*visit)
(vertex))}
}}intmain()
\n");}
startpoint++;}
//clear the visited
for(startpoint =
0; startpointnv; startpoint++
) visited[startpoint]=0
; startpoint =0;
while
(startpoint < graph->nv)
\n");}
startpoint++;}
return0;
}
資料結構PTA 基礎實驗6 2 2 漢密爾頓迴路
著名的 漢密爾頓 hamilton 迴路問題 是要找乙個能遍歷圖中所有頂點的簡單迴路 即每個頂點只訪問 1 次 本題就要求你判斷任一給定的迴路是否漢密爾頓迴路。輸入格式 首先第一行給出兩個正整數 無向圖中頂點數 n 21 v 2 vn 其中 n 是迴路中的頂點數,vi是路徑上的頂點編號。輸出格式 對...
pta資料結構
是否二叉搜尋樹 這題只要是了解二叉查詢樹的特點。bool isbst bintree t while right1 return isbst t left isbst t right 線性探測法的查詢函式 主要注意雜湊函式,這裡那個常量是真的坑,卡了半天。position find hashtabl...
PTA資料結構單選
最近學習資料結構鍊錶,被每週作業題所困。現做題解,以此共勉。析 不帶頭節點的單向鍊錶,一定具有頭指標,且在這兒以頭指標冠以鍊錶名。頭指標指向第乙個節點的儲存位置。向空鍊錶插入元素,則讓該插入元素的鏈結位址為h 第乙個節點的位置 再使頭指標h指向該元素。析 頭節點 位於首節點之前,為空,則鏈結位址為n...