● 請問你對圖論算法瞭解多少?(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 |
|
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 |
|