這篇部落格很早之前就寫好了,但是一直沒有發出來。。。。。。
在進行詳細解說之前,我們需要先借用圖的概念,圖就是由一些小圓點(稱為頂點)和連線這些小圓點的直線(稱為邊)組成的。如下圖是由5個頂點(
1,2,3,4,5)和5
條邊(1-2,1-2,1-4,2-5,3-4
)組成的。
現在我們從一號頂點開始遍歷這個圖,使用深度優先搜尋來遍歷這個圖將會得到如下的結果:
深度優先遍歷的主要思想是:首先以乙個未訪問過的頂點作為起始頂點,沿當前頂點的邊走到未訪問過的頂點;當沒有未訪問過的頂點時,則回到上乙個頂點,繼續試探訪問別的訪問,知道所有的頂點都被訪問過。顯然,深度優先搜尋的遍歷先沿著圖的某一條分支遍歷直到末端,然後回溯,再沿著另一條進行同樣的遍歷,直到所有的頂點都被訪問過為止。
在用深度優先搜尋時,最常使用的方法是用乙個二維陣列e來儲存。二維陣列中的第i行第j列表示的就是頂點i到頂點j是否有邊,1表示有邊,∞表示沒有邊。這裡我們將自己到自己設為0(即i=j),我們將這種儲存的方法稱為圖的鄰接矩陣儲存法。
廣度優先遍歷的主要思想就是:首先以乙個未被訪問過得頂點作為起始頂點,訪問其所有的相鄰的頂點,然後對每個相鄰的頂點,再訪問他們相鄰的未被訪問過的頂點,直到所有的頂點都被訪問過,遍歷結束。廣度優先遍歷往往是要用到佇列這個概念的。
深度優先搜尋和廣度優先搜尋的區別:
例1:小哼和小哈一同坐飛機去旅遊,他們現在位於1號城市,目標是5號城市,可是1號城市並沒有5號城市的直航。不過小哼已經收集了很多航班的資訊,吸納子啊小哼希望找到一種乘坐方式,使得轉機的次數最少,該如何解決?(題目**於:阿哈雷寫的《啊哈,演算法!》)
下面分別用兩種方式來解決這個問題:
深度優先搜尋:
#includeint e[100][100];
int book[100];
int min = 9999999;
int end; //結束的站點
int n;//n個城市
void dfs(int cur,int sum)
if(cur == end)
return;
}for(i = 0; i < n; i++)
}}int main()
else
} }//初始化陣列
//獲取兩個站點之間的航線
for(i = 0; i < m; i++)
book[start] = 1;
dfs(start,0);
printf("min = %d\n",min);
}
結果:
法二:廣度優先搜尋
#includestruct queue
;int main()
else
} }
for(i = 1; i <= m; i++)
que[tail].n = start;
que[tail].sum = 0;
tail++;
book[start] = 1;
while(head < tail)
if(que[tail-1].sum == end)
} if(flag == 1)
head++;
}printf("min = %d",que[tail-1].sum);
}
結果:
以上:我也不知道自己寫了些啥?最近效率有點低。。。。。。。
廣度搜尋和深度搜尋
我現在要從 雙子峰 前往 金門大橋 求最短的路徑 帶單獨參構造方法 public placetree string p 帶全參的構造方法 public placetree placetree left,placetree right,string p public static void main ...
搜尋 深度搜尋 廣度搜尋
迷宮 題目描述 一天extense在森林裡探險的時候不小心走入了乙個迷宮,迷宮可以看成是由n n的格點組成,每個格點只有2種狀態,和 前者表示可以通行後者表示不能通行。同時當extense處在某個格點時,他只能移動到東南西北 或者說上下左右 四個方向之一的相鄰格點上,extense想要從點a走到點b...
深度優先搜尋和廣度優先搜尋
深度優先的思想是先記住當前的起點,然後選定乙個方向一條道走到黑,若失敗則回到起點再選定另外乙個方向走到黑。廣度優先的思想是記住當前的起點,然後選定各個方向的相鄰點作為新的起點,再繼續。可以看出,深度優先和廣度優先都需要記住當前的起點,不同的是深度優先每次只需要記住乙個方向的相鄰點,廣度優先則要記住所...