• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            Breadth First Search Graph

            eryar@163.com

            一、簡介

            廣度優(yōu)先遍歷類似于樹的按層次遍歷過程。

            假設(shè)從圖中某頂點V出發(fā),在訪問了V之后依次訪問V的各個未曾訪問過的鄰接頂點,然后分別從這些鄰接點出發(fā)依次訪問它們的鄰接點,并使“先被訪問的頂點的鄰接點”先于“后被訪問的頂點的鄰接點”被訪問,直到圖中所有已被訪問的頂點的鄰接點都被訪問到。到此時圖中尚有未被訪問的頂點,則另選圖中一個未曾訪問的頂點作為始點,重復上述過程,直到圖中所有頂點都被訪問到為止。換言之,廣度優(yōu)先遍歷圖的過程是以V為起始點,由近至遠,依次訪問和V有路徑相通且路徑長度為1,2,……的頂點。

            為了順序訪問路徑長度為1,2,……的頂點,需要利用隊列的數(shù)據(jù)特性:先進先出來存儲已被訪問的路徑長度為1,2,……的頂點。

            二、C++實現(xiàn)

              1: //------------------------------------------------------------------------------
            
              2: //	Copyright (c) 2012 eryar All Rights Reserved.
            
              3: //
            
              4: //		File    : Main.cpp
            
              5: //		Author  : eryar@163.com
            
              6: //		Date    : 2012-8-25 17:11
            
              7: //		Version : 0.1v
            
              8: //
            
              9: //	Description : Use Adjacency List data structure to store Digraph.
            
             10: //
            
             11: //==============================================================================
            
             12: 
            
             13: #include <vector>
            
             14: #include <queue>
            
             15: #include <string>
            
             16: #include <iostream>
            
             17: using namespace std;
            
             18: 
            
             19: struct SVertexNode
            
             20: {
            
             21:     bool          bIsVisited;
            
             22:     string        data;
            
             23:     vector<int> vecLoc;
            
             24: };
            
             25: 
            
             26: typedef struct SEdge
            
             27: {
            
             28:     int iInitialNode;
            
             29: 
            
             30:     int iTerminalNode;
            
             31: 
            
             32: }Edge;
            
             33: 
            
             34: typedef struct SGraph
            
             35: {
            
             36:     int iVertexNum;
            
             37:     int iEdgeNum;
            
             38:     vector<SVertexNode> vecVertex;
            
             39: }Graph;
            
             40: 
            
             41: ///////////////////////////////////////////////////////////////////////////////
            
             42: // Functions of Graph
            
             43: void    Initialize(Graph& g, int v);
            
             44: Edge    MakeEdge(int v, int w);
            
             45: void    InsertEdge(Graph& g, const Edge& e);
            
             46: void    ShowGraph(const Graph& g);
            
             47: void    ClearVisitFlag(Graph& g);
            
             48: 
            
             49: // Use Depth First Search method to Traverse the graph.
            
             50: void    DepthFirstSearch(Graph& g);
            
             51: void    DepthFirstSearch(Graph& g, int v);
            
             52: 
            
             53: // Use Breadth First Search method to Traverse the graph.
            
             54: void    BreadthFirstSearch(Graph& g);
            
             55: 
            
             56: ///////////////////////////////////////////////////////////////////////////////
            
             57: // Main function.
            
             58: 
            
             59: int main(int agrc, char* argv[])
            
             60: {
            
             61:     Graph   aGraph;
            
             62: 
            
             63:     // Initialize the graph.
            
             64:     Initialize(aGraph, 4);
            
             65: 
            
             66:     // Insert some edges to make graph.
            
             67:     InsertEdge(aGraph, MakeEdge(0, 1));
            
             68:     InsertEdge(aGraph, MakeEdge(0, 2));
            
             69:     InsertEdge(aGraph, MakeEdge(2, 3));
            
             70:     InsertEdge(aGraph, MakeEdge(3, 0));
            
             71: 
            
             72:     // Show the graph.
            
             73:     ShowGraph(aGraph);
            
             74: 
            
             75:     // DFS traverse the graph.
            
             76:     DepthFirstSearch(aGraph);
            
             77: 
            
             78:     // BFS traverse the graph.
            
             79:     BreadthFirstSearch(aGraph);
            
             80: 
            
             81:     return 0;
            
             82: }
            
             83: 
            
             84: ///////////////////////////////////////////////////////////////////////////////
            
             85: 
            
             86: /**
            
             87: * brief	Initialize the graph.
            
             88: *
            
             89: *       v: vertex number of the graph.
            
             90: */
            
             91: void Initialize( Graph& g, int v )
            
             92: {
            
             93:     char    szData[6];
            
             94:     SVertexNode node;
            
             95: 
            
             96:     g.iVertexNum    = v;
            
             97:     g.iEdgeNum      = 0;
            
             98: 
            
             99:     for (int i = 0; i < v; i++)
            
            100:     {
            
            101:         sprintf(szData, "V%d", i+1);
            
            102:         node.data   = szData;
            
            103:         node.bIsVisited = false;
            
            104:         g.vecVertex.push_back(node);
            
            105:     }
            
            106: }
            
            107: 
            
            108: /**
            
            109: * brief	Make an edge by initial node and terminal node.
            
            110: */
            
            111: Edge MakeEdge( int v, int w )
            
            112: {
            
            113:     Edge    e;
            
            114: 
            
            115:     e.iInitialNode  = v;
            
            116:     e.iTerminalNode = w;
            
            117: 
            
            118:     return e;
            
            119: }
            
            120: 
            
            121: /**
            
            122: * brief	Insert an edge to the graph.
            
            123: */
            
            124: void InsertEdge( Graph& g, const Edge& e )
            
            125: {
            
            126:     g.vecVertex.at(e.iInitialNode).vecLoc.push_back(e.iTerminalNode);
            
            127: 
            
            128:     // If the graph is Undigraph, need do something here...
            
            129:     //g.vecVertex.at(e.iTerminalNode).vecLoc.push_back(e.iInitialNode);
            
            130: 
            
            131:     g.iEdgeNum++;
            
            132: }
            
            133: 
            
            134: /**
            
            135: * brief	Show the graph.
            
            136: */
            
            137: void ShowGraph( const Graph& g )
            
            138: {
            
            139:     cout<<"Show the graph: "<<endl;
            
            140: 
            
            141:     for (int i = 0; i < g.iVertexNum; i++)
            
            142:     {
            
            143:         cout<<"Node "<<i<<"("<<g.vecVertex.at(i).data<<")";
            
            144: 
            
            145:         for (int j = 0; j < g.vecVertex.at(i).vecLoc.size(); j++)
            
            146:         {
            
            147:             cout<<"->"<<g.vecVertex.at(i).vecLoc.at(j);
            
            148:         }
            
            149: 
            
            150:         cout<<endl;
            
            151:     }
            
            152: }
            
            153: 
            
            154: void ClearVisitFlag( Graph& g )
            
            155: {
            
            156:     for (int i = 0; i < g.iVertexNum; i++)
            
            157:     {
            
            158:         g.vecVertex.at(i).bIsVisited    = false;
            
            159:     }
            
            160: }
            
            161: 
            
            162: void DepthFirstSearch( Graph& g )
            
            163: {
            
            164:     cout<<"Depth First Search the graph:"<<endl;
            
            165: 
            
            166:     for (int i = 0; i < g.iVertexNum; i++)
            
            167:     {
            
            168:         if (!(g.vecVertex.at(i).bIsVisited))
            
            169:         {
            
            170:             DepthFirstSearch(g, i);
            
            171:         }
            
            172:     }
            
            173: }
            
            174: 
            
            175: void DepthFirstSearch(Graph& g, int v)
            
            176: {
            
            177:     int     iAdjacent   = 0;
            
            178:     SVertexNode node    = g.vecVertex.at(v);
            
            179: 
            
            180:     // Visit the vertex and mark it.
            
            181:     cout<<g.vecVertex.at(v).data<<endl;
            
            182:     g.vecVertex.at(v).bIsVisited = true;
            
            183: 
            
            184:     // Visit the adjacent vertex.
            
            185:     for (int i = 0; i < node.vecLoc.size(); i++)
            
            186:     {
            
            187:         iAdjacent   = node.vecLoc.at(i);
            
            188: 
            
            189:         if (!(g.vecVertex.at(iAdjacent).bIsVisited))
            
            190:         {
            
            191:             DepthFirstSearch(g, iAdjacent);
            
            192:         }
            
            193:     }
            
            194: 
            
            195: }
            
            196: 
            
            197: void BreadthFirstSearch( Graph& g )
            
            198: {
            
            199:     SVertexNode         node;
            
            200:     queue<SVertexNode> visitedNodes;
            
            201: 
            
            202:     cout<<"Breadth First Search the graph:"<<endl;
            
            203: 
            
            204:     ClearVisitFlag(g);
            
            205: 
            
            206:     for (int i = 0; i < g.iVertexNum; i++)
            
            207:     {
            
            208:         node    = g.vecVertex.at(i);
            
            209: 
            
            210:         if (!node.bIsVisited)
            
            211:         {
            
            212:             // Visit it.
            
            213:             cout<<node.data<<endl;
            
            214: 
            
            215:             // Set visite flag.
            
            216:             g.vecVertex.at(i).bIsVisited = true;
            
            217: 
            
            218:             // Enqueue.
            
            219:             visitedNodes.push(node);
            
            220: 
            
            221:             while (!visitedNodes.empty())
            
            222:             {
            
            223:                 node    = visitedNodes.front();
            
            224: 
            
            225:                 visitedNodes.pop();
            
            226: 
            
            227:                 for (int j = 0; j < node.vecLoc.size(); j++)
            
            228:                 {
            
            229:                     if (!g.vecVertex.at(j).bIsVisited)
            
            230:                     {
            
            231:                         cout<<g.vecVertex.at(j).data<<endl;
            
            232: 
            
            233:                         g.vecVertex.at(j).bIsVisited    = true;
            
            234: 
            
            235:                         visitedNodes.push(g.vecVertex.at(j));
            
            236:                     }
            
            237:                 }
            
            238:             }
            
            239:         }
            
            240:     }
            
            241: }
            
            242: 

             

            三、程序輸出

            程序的數(shù)據(jù)來源為原先用鄰接表生成圖的程序,可以根據(jù)需要自定義數(shù)據(jù)來驗證程序的正確性。

              1: Show the graph:
            
              2: Node 0(V1)->1->2
            
              3: Node 1(V2)
            
              4: Node 2(V3)->3
            
              5: Node 3(V4)->0
            
              6: Depth First Search the graph:
            
              7: V1
            
              8: V2
            
              9: V3
            
             10: V4
            
             11: Breadth First Search the graph:
            
             12: V1
            
             13: V2
            
             14: V3
            
             15: V4
            
             16: Press any key to continue
            
             17: 

            四、結(jié)論

            由上程序可知,廣度優(yōu)先遍歷圖的過各實質(zhì)上也是查找鄰接點的過程。因此,廣度優(yōu)先遍歷和深度優(yōu)先遍歷時間復雜度相同,兩者不同之處僅僅在于對頂點的訪問順序不同。

            亚洲va久久久噜噜噜久久天堂| 久久精品人人做人人妻人人玩| 狠狠色婷婷久久一区二区三区| 偷偷做久久久久网站| 色天使久久综合网天天 | 色综合久久无码中文字幕| 中文字幕无码久久精品青草 | 欧美一区二区三区久久综| 久久亚洲国产午夜精品理论片| 色狠狠久久AV五月综合| 亚洲国产精品无码久久久蜜芽| 亚洲精品无码久久一线| 午夜精品久久久久久久| 熟妇人妻久久中文字幕| AV无码久久久久不卡网站下载| 97久久久精品综合88久久| 99久久国产主播综合精品| 久久露脸国产精品| 久久免费看黄a级毛片| 久久久久久国产精品免费无码| 久久本道伊人久久| 久久久久久久亚洲精品 | 青青热久久国产久精品| 99久久国产综合精品女同图片| 久久精品国产亚洲AV高清热| 亚洲伊人久久大香线蕉苏妲己| 无码国内精品久久人妻麻豆按摩| 一本一本久久aa综合精品| 香蕉久久一区二区不卡无毒影院| 伊人伊成久久人综合网777| 久久精品国产亚洲精品2020 | av色综合久久天堂av色综合在| 精品久久久久久无码专区不卡| 国产精品无码久久综合网| 久久精品综合网| 99久久精品免费国产大片| 久久久久高潮综合影院| 久久国产成人| 久久91精品国产91久久小草| 国色天香久久久久久久小说| 国产精品成人99久久久久|