1. 程式人生 > >圖的BFS和DFS之C++實現

圖的BFS和DFS之C++實現

圖的建立

  1. 手動輸入,並以節點數作為輸入結束標誌
  2. 從檔案讀取,檔案的從第二行開始,每一行結束都要有節點數作為結束
    圖的儲存:
vector< list<int> > graph;

圖的BFS

非遞迴實現,藉助佇列

void bfs(int v)//以v開始做廣度優先搜尋(非遞迴實現,藉助佇列)
{
    list<int>::iterator it;
    visited[v] = true;
    cout << v << " ";
    queue<int> myque;
    myque.push(v);
    while
(!myque.empty()) { v = myque.front(); myque.pop(); for (it = graph[v].begin(); it != graph[v].end(); it++) { if (!visited[*it]) { cout << *it << " "; myque.push(*it); visited[*it] = true
;//訪問過 } } } cout << endl; }

圖的DFS

遞迴和非遞迴

void dfs(int v)//以v開始做深度優先搜尋
{
    list<int>::iterator it;
    visited[v] = true;
    cout << v << " ";
    for (it = graph[v].begin(); it != graph[v].end(); it++)
        if (!visited[*it])
            dfs(*it);
}
void
dfs_noRecursion(int v)//以v開始做深度優先搜尋,非遞迴實現 { list<int>::iterator it; visited[v] = true; cout << v << " "; stack<int>mystack; mystack.push(v); while (!mystack.empty()) { v = mystack.top(); mystack.pop(); if (!visited[v]) { cout << v << " "; visited[v] = true; } for (it = graph[v].begin(); it != graph[v].end(); it++) { if (!visited[*it]) { mystack.push(*it); } } } cout << endl; }

測試

#include<iostream>
#include <cstdio>
#include <list>
#include <vector>
#include <queue>
#include<stack>
#include<fstream>
using namespace std;
int n;
vector< list<int> > graph;
bool visited[100] = { 0 };
void CreateGraph()
{
    cout << "input the vertex num:" << endl;
    cin >> n;
    vector< list<int> >::iterator it;
    for (int i = 0; i < n; ++i)
    {
        list<int> i1;
        int t;
        while (cin >> t&&t != n)//輸入每個頂點相連的圖,以最終節點為結束標誌
            i1.push_back(t);
        graph.push_back(i1);
    }
}
void CreateGraph1()
{
    int n;
    vector< list<int> >::iterator it;
    ifstream in("data.txt");
    in >> n;
    for (int i = 0; i < n; ++i)
    {
        list<int> i1;
        int t;
        while (in >> t&&t != n)//輸入每個頂點相連的圖,以最終節點為結束標誌
            i1.push_back(t);
        graph.push_back(i1);
    }
}
void dfs(int v)//以v開始做深度優先搜尋
{
    list<int>::iterator it;
    visited[v] = true;
    cout << v << " ";
    for (it = graph[v].begin(); it != graph[v].end(); it++)
        if (!visited[*it])
            dfs(*it);
}
void dfs_noRecursion(int v)//以v開始做深度優先搜尋,非遞迴實現
{
    list<int>::iterator it;
    visited[v] = true;
    cout << v << " ";
    stack<int>mystack;
    mystack.push(v);
    while (!mystack.empty())
    {
        v = mystack.top();
        mystack.pop();
        if (!visited[v])
        {
            cout << v << " ";
            visited[v] = true;
        }

        for (it = graph[v].begin(); it != graph[v].end(); it++)
        {
            if (!visited[*it])
            {
                mystack.push(*it);

            }
        }
    }
    cout << endl;
}
void bfs(int v)//以v開始做廣度優先搜尋(非遞迴實現,藉助佇列)
{
    list<int>::iterator it;
    visited[v] = true;
    cout << v << " ";
    queue<int> myque;
    myque.push(v);
    while (!myque.empty())
    {
        v = myque.front();
        myque.pop();
        for (it = graph[v].begin(); it != graph[v].end(); it++)
        {
            if (!visited[*it])
            {
                cout << *it << " ";
                myque.push(*it);
                visited[*it] = true;//訪問過
            }
        }
    }
    cout << endl;
}
int main()
{
    CreateGraph1();
    cout << "result for bfs:" << endl;
    bfs(0);
    memset(visited, 0, sizeof(visited));
    cout << "result for dfs(Recursion):" << endl;
    dfs(0);
    cout << endl;
    memset(visited, 0, sizeof(visited));
    cout << "result for nodfs(Recursion):" << endl;
    dfs_noRecursion(0);
    system("pause");
    return 0;
}

參考:

相關推薦

BFSDFSC++實現

圖的建立 手動輸入,並以節點數作為輸入結束標誌 從檔案讀取,檔案的從第二行開始,每一行結束都要有節點數作為結束 圖的儲存: vector< list<int> > graph; 圖的BFS 非遞迴實現,藉助佇列 v

BFSDFS的java實現

<pre name="code" class="java"> import java.util.HashMap; import java.util.LinkedList; import java.util.Queue; /*廣度遍歷是遍歷到某個頂點,然後訪問其

【資料結構與演算法】自己動手實現BFSDFS(附完整原始碼)

圖的儲存結構    本文的重點在於圖的深度優先搜尋(DFS)和廣度優先搜尋(BFS),因此不再對圖的基本概念做過多的介紹,但是要先大致瞭解下圖的幾種常見的儲存結構。    鄰接矩陣    鄰接矩陣既可以用來儲存無向圖,也可以用來儲存有向圖。該結構實際上就是用一個二維陣列(鄰接

基於鄰接矩陣鄰接表的兩種方法實現無向BFSDFS

        廣度優先搜尋(Breadth-First-Search)和深度優先搜尋(Deep-First-Search)是搜尋策略中最經常用到的兩種方法,特別常用於圖的搜尋. BFS的思想:       從一個圖的某一個頂點V0出發,首先訪問和V0相鄰的且未被訪問過的

BFSDFS詳解以及java實現(轉載)

作者: Leo-Yang 原文都先發布在作者個人部落格: http://www.leoyang.net/ 本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利. 前言

的遍歷:BFSDFS

前言 圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點(V)表示,而物件之間的關係或者關聯則通過圖的邊(E)來表示。 圖可以分為有向圖和無向圖,一般用G=(V,E)來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。 在圖的基本演算法中,最初需要

每日一題——的遍歷(BFS DFS

題目描述 從鍵盤接收有向圖的頂點集,弧集,建立有向圖,並完成下列任務: (1)計算結點的出度、入度以及度; (2) 從第一個頂點出發,求一個深度優先遍歷序列; (3) 從第一個頂點頂點出發,求一個廣度優先遍歷序列。 注意:以使用者輸入各個頂點

BFSDFS原理及例項分析(java)

BFS和DFS是圖的兩種遍歷方式,是最簡單的圖搜尋演算法。 本文將給出給出BFS和DFS的以下幾種實現方式: 1、使用佇列Queue實現圖的BFS遍歷 2、遞迴實現圖的DFS遍歷 3、使用棧Stack迭代實現圖的DFS遍歷 一、BFS(廣度優先搜尋

BFSDFS的差別,BFS實現迷宮最短路徑

BFS能夠求得最短路徑,因為BFS每進行一次相當於當前的路徑長度。對於一個N*N矩陣,BFS最多執行n*n次。 深度優先搜尋相當於一個人在走迷宮,廣搜相當於是無窮人沿著不同方向走(因為每條路都同時有人走)。 DFS相當於是一個下壓棧。是先進後出的原則(如

Python 實現 BFS DFS

# BFS graph = { "A" : ["B", "C"], "B" : ["A", "C", "D"], "C" : ["A", "B", "D", "E"], "D" : ["B", "C", "E", "F"],

PrimKruskal演算法C++實現

最近好長時間都困惑在這兩個演算法中,其實也不難,就是寫的時候比較費勁。現在總結一下。 首先說一下兩個演算法是幹嘛呢? 都是求解一個無向圖G的最小生成樹(minimum spanning tree),就是由該圖的那些連線G的所有頂點的邊構成的樹,其總值最低。這

的基本演算法(BFSDFS

圖是一種靈活的資料結構,一般作為一種模型用來定義物件之間的關係或聯絡。物件由頂點(V)表示,而物件之間的關係或者關聯則通過圖的邊(E)來表示。 圖可以分為有向圖和無向圖,一般用G=(V,E)來表示圖。經常用鄰接矩陣或者鄰接表來描述一副圖。 在圖的基本演算法中

論演算法:最短路徑——無權最短路徑演算法Dijkstra演算法C++實現

前言        今天將給大家介紹的是圖論演算法中的另外一個基礎部分——最短路徑演算法;其中又分為無權最短路徑,單源最短路徑,具有負邊的最短路徑以及無圈圖等;而這次將介紹常見的兩個——無權最短路徑以及單源最短路徑。接下來就開始我們的講解吧~~原理        最短路徑演算

鄰接表實現有向BFSDFS、拓撲排序

圖的大家族 常用圖的儲存結構有兩種:鄰接矩陣,鄰接表。一個數組,一個連結串列,可見覆雜的資料結構是建立在基礎結構之上的,在這裡選擇鄰接表儲存,邊比較少時省空間。 圖按照有無方向,有無權重,分為四類 無向無權:無向圖 無向有權:無向網 有向無權:有向圖

BFSDFS

一、BFS #include<iostream> #include<queue> using namespace std; const int max_num = 100; class BFS{ public: typedef int Vert

BFSDFS詳解以及java實現

前言 圖在演算法世界中的重要地位是不言而喻的,曾經看到一篇Google的工程師寫的一篇《Get that job at Google!》文章中說到面試官問的問題中幾乎有一半的問題都可以用圖的方法去解決。由此也可以看出圖確實適用範圍確實很廣。 圖的表示 閒話不多說,首先要

的儲存遍歷C++實現

最近在做一些OJ題目時,感覺自己圖的應用還不夠熟練。所以又翻書看別人的部落格複習了一下,現把圖的常用內容總結如下: 圖的常用儲存方法有:鄰接矩陣和鄰接表 遍歷方法有:按深度遍歷(DFS),按廣度遍歷(BFS) 下面的程式碼都是C++寫的,用了一些STL庫的容器:

常見緩存算法LRU的c++實現

lru對於web開發而言,緩存必不可少,也是提高性能最常用的方式。無論是瀏覽器緩存(如果是chrome瀏覽器,可以通過chrome:://cache查看),還是服務端的緩存(通過memcached或者redis等內存數據庫)。緩存不僅可以加速用戶的訪問,同時也可以降低服務器的負載和壓力。那麽,了解常見的緩存淘

BFS DFS

status pos preorder 速度 算法 遍歷 white postorder 深度優先 BFS and DFS 一般來說,能用DFS解決的問題,都能用BFS。DFS容易爆棧,而BFS可以自己控制隊列的長度。深度優先一般是解決連通性問題,而廣度優先一般是解決最短路

建造者模式C++實現

emp 產品 它的 聚合 begin tor typename 默認 學習交流 說明:本文僅供學習交流,轉載請標明出處。歡迎轉載! 建造者模式(Builder)也叫生成器模式,我們都知道。假設我們想完畢一個復雜產品的創建過程,我們必須分開創建。再組裝。比