- // Copyright 2008 All Rights Reserved.
- // Author: Zhiyi ZHOU
- #ifndef _MATRIXGRPAH_H_2008_
- #define _MATRIXGRPAH_H_2008_
- #include "Graph.h"
- #include <assert.h>
- class MatrixVertex:public Vertex{
- public:
- typedef vector<Edge*> EdgeVec;
- typedef EdgeVec::iterator EdgeIterator;
- typedef EdgeVec::size_type size_t;
- private:
- EdgeVec outEdges;
- EdgeVec inEdges;
- int curIndex;
- protected:
- void setInEdge(Edge* edge){
- inEdges.push_back(edge);
- //inEdges[edge->getSource().getIndex()]=edge;
- inDegree++;
- }
- void setOutEdge(Edge* edge){
- //outEdges[edge->getTarget().getIndex()]=edge;
- outEdges.push_back(edge);
- outDegree++;
- }
- public:
- MatrixVertex(size_t index,int size):Vertex(index){
- //outEdges.assign(size,NULL);
- //inEdges.assign(size,NULL);
- }
- ~MatrixVertex(){
- for(size_t i=0;i<outEdges.size();i++){
- if(outEdges[i]!=NULL)
- delete outEdges[i];
- }
- }
- Edge* getFirstEdge()const{
- //size_t i=0;
- //while(i<outEdges.size() && outEdges[i]==NULL)i++;
- //curIndex=0;
- return outEdges.front();
- }
- Edge* getNextEdge(const Edge& edge)const{
- assert(&edge!=NULL);
- //size_t i=edge.getTarget().getIndex()+1;
- //if(*outEdges.at(curIndex)==edge){
- // if(++const_cast<int>(curIndex)<outEdges.size())
- // return outEdges[curIndex];
- // return NULL;
- //}
- for(EdgeVec::const_iterator iter=outEdges.begin();iter!=outEdges.end();iter++){
- if(**iter==edge){
- if(++iter!=outEdges.end())
- return *iter;
- break;
- }
- }
- return NULL;
- }
- Edge& addEdge(Vertex& vertex,int weight,bool directed=false){
- //assert(vertex.getIndex()<outEdges.size());
- Edge* edge=new Edge(*this,vertex,0,weight);
- int destIndex=vertex.getIndex();
- this->setOutEdge(edge);
- if(!directed){
- vertex.setInEdge(edge);
- }
- return *edge;
- }
- Edge& removeEdge(const Vertex& vertex,bool directed=false){
- //assert(vertex.getIndex()<outEdges.size());
- Edge* edge=outEdges[vertex.getIndex()];
- outEdges[vertex.getIndex()]=NULL;
- outDegree--;
- if(!directed){
- inEdges[vertex.getIndex()]=NULL;
- inDegree--;
- }
- return *edge;
- }
- bool pointTo(const Vertex& vertex)const{
- //assert(vertex.getIndex()<outEdges.size());
- return outEdges[vertex.getIndex()]!=NULL;
- }
- };
- class MatrixGraph:virtual public Graph{
- public:
- typedef vector<Vertex*> VertexVec;
- typedef VertexVec::iterator VertexIterator;
- typedef VertexVec::size_type size_t;
- typedef vector<Edge*> EdgeVec;
- typedef EdgeVec::iterator EdgeIterator;
- private:
- VertexVec vertexs;
- EdgeVec edges;
- int edgeSize;
- protected:
- void initialize(Vertex& vertex,int* weight,int size){
- size_t i=0;
- for(;i<size;i++){
- if(weight[i]!=0){
- Edge* e=&vertex.addEdge(this->getVertex(i),weight[i]);
- e->setLabel(edgeSize++);
- edges.push_back(e);
- }
- }
- }
- public:
- MatrixGraph(bool tag=true):Graph(tag){
- edgeSize=0;
- }
- MatrixGraph(int** weight,size_t size,bool tag=true):Graph(tag){
- edgeSize=0;
- mark.assign(size,false);
- for(size_t i=0;i<size;i++){
- vertexs.push_back(new MatrixVertex(i,size));
- }
- for(size_t i=0;i<size;i++){
- initialize(*vertexs[i],weight[i],size);
- }
- edgeMark.assign(getEdgeNum(),false);
- }
- ~MatrixGraph(){
- for(size_t i=0;i<vertexs.size();i++){
- if(vertexs[i]!=NULL)
- delete vertexs[i];
- }
- }
- inline size_t getVerticesNum()const{
- return vertexs.size();
- }
- inline size_t getEdgeNum()const{
- return edges.size();
- }
- inline Vertex& getVertex(size_t index)const{
- assert(index<vertexs.size());
- return *vertexs[index];
- }
- void setVertex(Vertex& vertex,size_t index){
- assert(index<vertexs.size());
- vertex.setIndex(index);
- vertexs[index]=&vertex;
- }
- protected:
- Vertex& addVertex(Vertex& vertex){
- vertex.setIndex(vertexs.size());
- vertexs.push_back(&vertex);
- return vertex;
- }
- Vertex& remove(size_t index){
- Vertex* value=NULL;
- return *value;
- }
- };
- #endif
图的邻接矩阵实现
最新推荐文章于 2025-03-05 20:35:17 发布