Graph implementation C++

前端 未结 7 751
悲&欢浪女
悲&欢浪女 2020-11-30 17:38

I was wondering about a quick to write implementation of a graph in c++. I need the data structure to be easy to manipulate and use graph algorithms(such as BFS,DFS, Kruskal

7条回答
  •  孤城傲影
    2020-11-30 18:10

    I prefer using an adjacency list of Indices ( not pointers )

    typedef std::vector< Vertex > Vertices;
    typedef std::set  Neighbours;
    
    
    struct Vertex {
    private:
       int data;
    public:
       Neighbours neighbours;
    
       Vertex( int d ): data(d) {}
       Vertex( ): data(-1) {}
    
       bool operator<( const Vertex& ref ) const {
          return ( ref.data < data );
       }
       bool operator==( const Vertex& ref ) const {
          return ( ref.data == data );
       }
    };
    
    class Graph
    {
    private :
       Vertices vertices;
    }
    
    void Graph::addEdgeIndices ( int index1, int index2 ) {
      vertices[ index1 ].neighbours.insert( index2 );
    }
    
    
    Vertices::iterator Graph::findVertexIndex( int val, bool& res )
    {
       std::vector::iterator it;
       Vertex v(val);
       it = std::find( vertices.begin(), vertices.end(), v );
       if (it != vertices.end()){
            res = true;
           return it;
       } else {
           res = false;
           return vertices.end();
       }
    }
    
    void Graph::addEdge ( int n1, int n2 ) {
    
       bool foundNet1 = false, foundNet2 = false;
       Vertices::iterator vit1 = findVertexIndex( n1, foundNet1 );
       int node1Index = -1, node2Index = -1;
       if ( !foundNet1 ) {
          Vertex v1( n1 );
          vertices.push_back( v1 );
          node1Index = vertices.size() - 1;
       } else {
          node1Index = vit1 - vertices.begin();
       }
       Vertices::iterator vit2 = findVertexIndex( n2, foundNet2);
       if ( !foundNet2 ) {
          Vertex v2( n2 );
          vertices.push_back( v2 );
          node2Index = vertices.size() - 1;
       } else {
          node2Index = vit2 - vertices.begin();
       }
    
       assert( ( node1Index > -1 ) && ( node1Index <  vertices.size()));
       assert( ( node2Index > -1 ) && ( node2Index <  vertices.size()));
    
       addEdgeIndices( node1Index, node2Index );
    }
    

提交回复
热议问题