圖的遍歷

對(duì)于圖的操作,最基本的就是對(duì)圖的遍歷了韩玩,圖的遍歷主要有兩種思想惭每,一種是DFS(Deepth First Search)深度優(yōu)先遍歷,另外一種是BFS(Breadth First Search)廣度優(yōu)先遍歷
  • DFS
    • 算法特點(diǎn):DFS算法鳖擒,從名字中就可以得出信息,深度優(yōu)先的烫止,那么在算法的執(zhí)行過(guò)程中蒋荚,總是將沿著一條路徑一直深入,直到?jīng)]有路徑了再返回查看其他路徑馆蠕∑谏可以看出惊奇,DFS算法是一種遞歸的過(guò)程,我們?cè)俾?lián)想到樹(shù)的遍歷中吓妆,其實(shí)DFS算法就是樹(shù)的先序遍歷赊时。
    • 算法具體代碼
      • 遞歸版
        • 具體代碼:
int graph[N][N] = {
        { 0, 1, 1, 0, 0 },
        { 0, 0, 1, 0, 1 },
        { 0, 0, 1, 0, 0 },
        { 1, 1, 0, 0, 1 },
        { 0, 0, 1, 0, 0 }
};
int visited[N] = { 0, };
void DFS(int start)
{
        visited[start] = 1;
        for (int i = 0; i < N; i++)
        {
            if (!visited[i] && graph[start][i] == 1) // 找到相鄰的點(diǎn),同時(shí)這個(gè)點(diǎn)沒(méi)有被訪(fǎng)問(wèn)過(guò)
                DFS(i);
       }
        cout << start << " ";
    }
int main()
{
        for (int i = 0; i < N; i++)
        {
            if (!visited[i])
                DFS(i);
        }
        return 0;
    }
  * 算法分析:由于是遞歸調(diào)用行拢,那么每次遞歸都是一個(gè)單元祖秒,這個(gè)單元需要做的事情就是去找相鄰的沒(méi)有訪(fǎng)問(wèn)過(guò)的節(jié)點(diǎn),對(duì)這個(gè)節(jié)點(diǎn)重復(fù)遞歸舟奠,而去尋找這樣的節(jié)點(diǎn)就是遞歸的終止條件竭缝,即是如果沒(méi)有找到這樣的點(diǎn),那么遞歸終止沼瘫,返回上一層調(diào)用
* **非遞歸版**
  * 具體代碼:
int graph[N][N] = {
    { 0, 1, 1, 0, 0 },
    { 0, 0, 1, 0, 1 },
    { 0, 0, 1, 0, 0 },
    { 1, 1, 0, 0, 1 },
    { 0, 0, 1, 0, 0 }
};
int visited[N] = { 0, };
void DFS(int start)
{
          stack<int> s; // 使用一個(gè)棧進(jìn)行輔助
          s.push(start);
          visited[start] = 1;
          bool isPush = false;
          while (!s.empty())
          {
              isPush = false;
              int v = s.top();
              for (int i = 0; i < N; i++)
              {
                if (graph[v][i] == 1 && !visited[i])
                {
                    visited[i] = 1;
                    s.push(i);
                    isPush = true;
                    break; // 找到了一個(gè)符合節(jié)點(diǎn)就先彈出當(dāng)前位置
                }
              }
              if (!isPush)
              {
                  cout << v << " ";
                  s.pop();
              }
           }
}
int main()
{
          for (int i = 1; i <= N; i++)
          {
              if (!visited[i])
                  DFS(i);
          }
          return 0;
}
  * 算法分析:非遞歸的情況下抬纸,使用迭代的思想,需要借助一個(gè)棧去模擬遞歸的過(guò)程耿戚,然后用while循環(huán)進(jìn)行控制湿故,在非遞歸的情況下需要去手動(dòng)加上兩個(gè)東西:
    * 終止條件:利用一個(gè)標(biāo)記來(lái)作控制,用來(lái)控制找不到點(diǎn)的情況
    * 棧行為:如果找到一個(gè)符合的點(diǎn)膜蛔,那么就將其壓入棧坛猪,并且彈出本次循環(huán),如果遇到終止條件皂股,那么就將目前的棧彈出一個(gè)
  • BFS
    • 算法特點(diǎn):BFS從字面上來(lái)理解就是廣度搜索墅茉,與深度搜索不同的是,BFS會(huì)將每個(gè)節(jié)點(diǎn)的周?chē)蠗l件的節(jié)點(diǎn)都遍歷之后才會(huì)繼續(xù)向下遍歷呜呐,BFS實(shí)際上和樹(shù)的層序遍歷很像就斤。
    • 算法實(shí)際代碼
int maze[N][N] = {
      { 0, 1, 1, 0, 0 },
      { 0, 0, 1, 1, 0 },
      { 0, 1, 1, 1, 0 },
      { 1, 0, 0, 0, 0 },
      { 0, 0, 1, 1, 0 }
};
int visited[N + 1] = { 0, };
void BFS(int start)
{
      queue<int> Q;
      Q.push(start);
      visited[start] = 1;
      while (!Q.empty())
      {
          int front = Q.front();
          cout << front << " ";
          Q.pop();
          for (int i = 1; i <= N; i++)
          {
              if (!visited[i] && maze[front - 1][i - 1] == 1)
              {
                  visited[i] = 1;
                  Q.push(i);
              }
          }
      }
  }
int main()
{
    for (int i = 1; i <= N; i++)
    {
        if (visited[i] == 1)
            continue;
        BFS(i);
    }
    return 0;
}
  • 算法分析
    BFS實(shí)際上市借助了隊(duì)列這種結(jié)構(gòu),對(duì)于每個(gè)節(jié)點(diǎn)蘑辑,都將它相鄰的同時(shí)符合條件的節(jié)點(diǎn)壓入到隊(duì)列中洋机,然后在遍歷完這個(gè)節(jié)點(diǎn)的時(shí)候就將這個(gè)節(jié)點(diǎn)給壓出隊(duì)列
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市以躯,隨后出現(xiàn)的幾起案子槐秧,更是在濱河造成了極大的恐慌,老刑警劉巖忧设,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異颠通,居然都是意外死亡址晕,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)顿锰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谨垃,“玉大人启搂,你說(shuō)我怎么就攤上這事×跆眨” “怎么了胳赌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)匙隔。 經(jīng)常有香客問(wèn)我疑苫,道長(zhǎng),這世上最難降的妖魔是什么纷责? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任捍掺,我火速辦了婚禮,結(jié)果婚禮上再膳,老公的妹妹穿的比我還像新娘挺勿。我一直安慰自己,他們只是感情好喂柒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布不瓶。 她就那樣靜靜地躺著,像睡著了一般灾杰。 火紅的嫁衣襯著肌膚如雪蚊丐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天吭露,我揣著相機(jī)與錄音吠撮,去河邊找鬼。 笑死讲竿,一個(gè)胖子當(dāng)著我的面吹牛泥兰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播题禀,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鞋诗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了迈嘹?” 一聲冷哼從身側(cè)響起削彬,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎秀仲,沒(méi)想到半個(gè)月后融痛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡神僵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年雁刷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片保礼。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沛励,死狀恐怖责语,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情目派,我是刑警寧澤坤候,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站企蹭,受9級(jí)特大地震影響白筹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜练对,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一酿联、第九天 我趴在偏房一處隱蔽的房頂上張望械念。 院中可真熱鬧升熊,春花似錦菱涤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至下隧,卻和暖如春奢人,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背淆院。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工何乎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人土辩。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓支救,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親拷淘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子各墨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,743評(píng)論 0 33
  • -DFS(Depth First Search):深度優(yōu)先搜索 訪(fǎng)問(wèn)完一個(gè)頂點(diǎn)的所有鄰接點(diǎn)之后启涯,會(huì)按原路返回贬堵,對(duì)應(yīng)...
    Spicy_Crayfish閱讀 2,836評(píng)論 1 0
  • 概念 定義 圖是一種較線(xiàn)性表和樹(shù)更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)相較于線(xiàn)性表的一對(duì)一(每個(gè)結(jié)點(diǎn)只有一個(gè)前驅(qū)后驅(qū))和樹(shù)的一對(duì)多(層...
    MrDTree閱讀 1,137評(píng)論 0 2
  • 在給出圖的定義后第一個(gè)問(wèn)題就是如何遍歷圖的所有頂點(diǎn),有兩種最基礎(chǔ)的圖遍歷算法结洼。如果給圖添加更多的特征和屬性黎做,將產(chǎn)生...
    9bc96fd72f8e閱讀 4,930評(píng)論 0 1
  • 清晨醒來(lái)后的希望 夜晚來(lái)臨時(shí)的失望 伴隨著每天的搖晃 一生就是這樣匆忙
    翦夢(mèng)閱讀 263評(píng)論 16 23