图的接口定义

 
  1. // Copyright 2008 All Rights Reserved.
  2. // Author: Zhiyi ZHOU
  3. #pragma once
  4. #ifndef _GRAPH_H_2008_
  5. #define _GRAPH_H_2008_
  6. #include <assert.h>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <algorithm>
  11. #include <functional>
  12. using namespace std;
  13. class Vertex;
  14. class Edge{
  15. protected:
  16.     int label;
  17.     int weight;
  18.     Vertex* source;
  19.     Vertex* target;
  20. public:
  21.     Edge(){
  22.         label=weight=0;
  23.         source=target=NULL;
  24.     }
  25.     Edge(const Vertex& source,const Vertex& target,int label=0,int weight=0){
  26.         this->label=label;
  27.         this->weight=weight;
  28.         this->source=const_cast<Vertex*>(&source);
  29.         this->target=const_cast<Vertex*>(&target);
  30.     }
  31.     virtual ~Edge(){};
  32.     inline virtual int getLabel()const{return label;}
  33.     inline virtual void setLabel(int value){label=value;}
  34.     inline virtual int getWeight()const{return weight;}
  35.     inline virtual void setWeight(int value){weight=value;}
  36.     inline bool operator==(const Edge& edge)const{
  37.         return label==edge.getLabel();
  38.     }
  39.     virtual void print()const{};
  40.     inline virtual Vertex& getSource()const{
  41.         return *source;
  42.     }
  43.     virtual Vertex& setSource(Vertex& vertex){
  44.         source=&vertex;
  45.         return *source;
  46.     }
  47.     virtual Vertex& getTarget()const{
  48.         return *target;
  49.     }
  50.     virtual Vertex& setTarget(Vertex& vertex){
  51.         target=&vertex;
  52.         return *target;
  53.     }
  54. };
  55. class Vertex{
  56. protected:
  57.     int index;
  58.     int outDegree;
  59.     int inDegree;
  60. public:
  61.     Vertex(int index=0):index(index){
  62.         outDegree=0;
  63.         inDegree=0;
  64.     };
  65.     inline virtual int getIndex()const{return index;}
  66.     inline virtual void setIndex(int index){this->index=index;}
  67.     inline int getOutDegree()const{return outDegree;}
  68.     inline int getInDegree()const{return inDegree;}
  69.     virtual Edge* getFirstEdge()const=0;
  70.     virtual Edge* getNextEdge(const Edge& edge)const=0;
  71.     virtual void setInEdge(Edge* edge)=0;
  72.     virtual void setOutEdge(Edge* edge)=0;
  73.     virtual Edge& addEdge(Vertex& vertex,int weight,bool directed=false)=0;
  74.     virtual Edge& removeEdge(const Vertex& vertex,bool directed=false)=0;
  75.     virtual bool pointTo(const Vertex& vertex)const=0;
  76.     virtual void print()const{}
  77.     virtual ~Vertex(){}
  78. };
  79. class Graph
  80. {
  81. protected:
  82.     bool directed;
  83.     vector<bool> mark;
  84.     vector<bool> edgeMark;
  85. public:
  86.     typedef unsigned int size_t;
  87.     typedef Vertex& Reference;
  88.     typedef const Vertex& const_Reference;
  89.     Graph(bool tag=true){
  90.         directed=tag;
  91.     }
  92.     bool isDirectedGraph()const{return directed;}
  93.     
  94.     virtual size_t getVerticesNum()const=0;
  95.     virtual size_t getEdgeNum()const=0;
  96.     virtual Reference getVertex(size_t index)const=0;
  97.     virtual void setVertex(Vertex& vertex,size_t index)=0;
  98.     Reference operator[](size_t index)const{
  99.         return getVertex(index);
  100.     }
  101.     virtual ~Graph(void){}
  102.     bool isVisited(const Vertex& vertex)const{
  103.         return mark.at(vertex.getIndex());
  104.     }
  105.     void visit(const Vertex& vertex){
  106.         mark[vertex.getIndex()].flip();
  107.     }
  108.     bool isVisited(const Edge& edge)const{
  109.         return edgeMark.at(edge.getLabel());
  110.     }
  111.     void visit(const Edge& edge){
  112.         edgeMark[edge.getLabel()]=true;
  113.         if(!isDirectedGraph()){
  114.             Edge* e=findEdge(edge.getTarget(),edge.getSource());
  115.             if(e!=NULL)
  116.                 edgeMark[e->getLabel()]=true;
  117.         }
  118.     }
  119.     void clearState(){
  120.         mark.assign(mark.size(),false);
  121.         edgeMark.assign(edgeMark.size(),false);
  122.     }
  123. protected:
  124.     Edge* findEdge(const Vertex& src,const Vertex& target)const{
  125.         if(&src==NULL || &target==NULL)
  126.             return NULL;
  127.         size_t index=target.getIndex();
  128.         for(Edge* edge=src.getFirstEdge();edge!=NULL;edge=src.getNextEdge(*edge)){
  129.             if(edge->getTarget().getIndex()==index)
  130.                 return edge;
  131.         }
  132.         return NULL;
  133.     }
  134.     virtual Vertex& addVertex(Vertex& vertex)=0;
  135.     virtual Vertex& remove(size_t index)=0;
  136. };
  137. #endif

你可能感兴趣的:(null,Graph)