zoukankan      html  css  js  c++  java
  • graph-basic

    打算使用STL中的vector,通过邻接链表的方式存储图。这里贴基本定义,以及depth-first-search和breadth-first-search的实现代码。

    其他图的算法实现,就贴在各自的算法解释之后吧。喵。

    #include <iostream>  
    #include <vector>  
    #include <set>  
    #include <algorithm>
    using namespace std;  
      
    // define vertex in graph  
    typedef struct Vertex {  
        int id;  
        vector<int> neighbors;  
        Vertex() {
        	id = -1;
    	}  
        Vertex(int nid){
        	id = nid;
    	}  
    } Vertex;  
    // define graph
    typedef struct Graph {
        // Vertex of Graph  
        vector<Vertex> vertexes;
        // number of vertexes
        int nVertexes;
        bool isDAG;
        
    	// construct function
        Graph(int n, bool isDAG) : nVertexes(n), isDAG(isDAG) { vertexes.resize(n); }  
      
        // add edge.
        bool addEdge(int id1, int id2) {  
            if (max(id1, id2) >= vertexes.size()) 
    		    return false;  
            if (isDAG) {  
                vertexes[id1].neighbors.push_back(id2);  
            }  
            else {  
                vertexes[id1].neighbors.push_back(id2);  
                vertexes[id2].neighbors.push_back(id1);  
            }  
            return true;  
        }  
        
        // depth first search  
        vector<int> DFS(int start) {  
            set<int> visited;  
            vector<int> g, result;  
            g.push_back(start);   
            visited.insert(start);  
            result.push_back(start);  
            bool found;  
            while(g.size() > 0) {  
                int id = g[g.size()-1];           
                found = false;  
                for(int i = 0; i < vertexes[id].neighbors.size(); i++) {  
                    int id1 = vertexes[id].neighbors[i];  
                    if (visited.count(id1) == 0) {  
                        g.push_back(id1);  
                        result.push_back(id1);  
                        visited.insert(id1);    
                        found = true;  
                        break;  
                    }  
                }  
                // all neighbors have been visited
                if (!found) {  
                    int id2 = g[g.size()-1];  
                    //result.push_back(-1 * id2);  
                    //cout << "pop " << id2 << " ";  
                    g.pop_back();  
                }  
            }  
            return result;  
        }
        
        // breadth first search 
        vector<int> BFS(int start) {  
    		set<int> visited;  
            vector<int> g, result;
    		// temporary store  
            g.push_back(start);  
            visited.insert(start);  
            while(g.size() > 0) {  
                int id = g[0];            
                g.erase(g.begin());  
                result.push_back(id);  
                for(int i = 0; i < vertexes[id].neighbors.size(); i++) {  
                    int id1 = vertexes[id].neighbors[i];  
                    // if id1 is unvisited
                    if (visited.count(id1) == 0) {  
                        g.push_back(id1);  
                        visited.insert(id1);  
                    }  
                }  
            }  
            return result;  
        }      
    } Graph;  
      
    int main() {  
        Graph g(8, true);  
        g.addEdge(0, 1);  
        g.addEdge(0, 3);  
        g.addEdge(1, 2);  
        g.addEdge(3, 4);  
        g.addEdge(3, 5);  
        //g.addEdge(4, 5);  
        //g.addEdge(4, 6);      
        g.addEdge(5, 6);  
        g.addEdge(5, 7);      
        //g.addEdge(6, 7);  
        vector<int> bv = g.BFS(0);  
        cout << "宽度优先搜索节点顺序:";  
        for(int j = 0; j < bv.size(); j++)  
            cout << bv[j] << " ";  
        cout << endl;  
        
        bv = g.DFS(0);
        for(int j = 0; j < bv.size(); j++)  
            cout << bv[j] << " ";  
        cout << endl; 
        
        cout << "深度优先搜索节点顺序:";  
        Graph g1(6, false);  
        g1.addEdge(0, 1);  
        g1.addEdge(0, 4);  
        g1.addEdge(0, 5);  
        g1.addEdge(1, 5);  
        g1.addEdge(4, 5);  
        g1.addEdge(5, 2);  
        g1.addEdge(5, 3);  
        g1.addEdge(2, 3);  
        vector<int> route = g1.DFS(0);  
        for(int i = 0; i < route.size(); i++)  
            cout << route[i] << " ";  
        cout << endl;  
       
        return 0;  
    } 
    

      

  • 相关阅读:
    对于Sobel算子的学习
    HDU 2594(求最长公共前后缀 kmp)
    HDU 6108(整除判断 数学)
    HDU 5968(异或计算 暴力)
    HDU 5963(游戏 博弈+规律)
    简单算法考题记录
    flex与bison
    C++ 智能指针
    Linux 添加设备驱动程序
    Linux 添加系统调用
  • 原文地址:https://www.cnblogs.com/pxy7896/p/6581234.html
Copyright © 2011-2022 走看看