第5章 第13節 圖

●   請問你對圖論算法瞭解多少?(BFS,DFS,最短路徑,最小生成樹,最小割最大流...)平常有用過嗎?

參考回答:


DFS:深度優先搜索算法思路:

從頂點V開始,訪問這個頂點,然後依次從V的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和V有路徑的相通的頂點都被訪問了,如果此時還有頂點未被訪問,則選擇圖中未被訪問的那個頂點作爲起點,重複上述動作。

void DFS_store_array(Graph_array g,int v,bool * & visit) {cout << g.infromation[v] << " ";visit[v] = true;



for (int i = 0; i < g.vexnum; i++) {//找出下一個位被訪問的頂點


if (g.arc[v][i] == 0 || g.arc[v][i] == INT_MAX) { //如果兩個頂點不存在邊


continue;


}


else if (!visit[i]) {//如果沒有被訪問,訪問該結點


DFS_store_array(g, i, visit);
}
}
}



BFS廣度優先搜索思路就是:假設從圖中的頂點V出,在訪問了v之後,依次訪問v的各個未被訪問的鄰接點,然後,分別從這些鄰接點出發,依次訪問他們的鄰接點,並使“先被訪問的頂點的鄰接點”先於“後被訪問的鄰接點”先被訪問,直至圖中所有的頂點都被訪問到爲止,防止出現非連通圖的情況,我們需要最後遍歷一遍,看是否所有的點都被訪問了,如果有未被訪問的點,那麼就把該點作爲一個新的起點。


void BFS_list(Graph_List g, int begin) {
int i;
bool * visit = new bool[g.vexnum];
for (i = 0; i < g.vexnum; i++) {
visit[i] = false;
}





cout << "圖的BFS遍歷結果:" << endl;


複製代碼

1

2

queue<int>  q;

for (int v = 0; v < g.vexnum; v++) {


if (!visit[(begin - 1 + v) % g.vexnum])//注意起點不一定是v1


{
cout << g.node[(begin - 1 + v) % g.vexnum].data << " ";
visit[(begin - 1 + v) % g.vexnum] = true;


q.push((begin - 1 + v) % g.vexnum);//初始化我們的隊列


while (!q.empty())
{
int u = q.front();
q.pop();
ArcNode * next;




next = g.node[u].firstarc;//獲得依附在該頂點的第一條邊的信息


while (next) {//遍歷該鏈表上的所有的點


複製代碼

1

2

3

4

5

6

7

8

9

10

11

if (!visit[next->adfvex]) {

cout << g.node[next->adfvex].data << " ";

visit[next->adfvex] = true;

q.push(next->adfvex);

}

next = next->next;

}

}

}

}

}

圖片


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章