图的邻接矩阵表示广度深度遍历大连理工大学数据结构上机
2017-12-10 21:40
609 查看
#include <iostream> #include <Queue.h> //队列,可用之前文章里面的Queue.h using namespace std; template<class EdgeType> class Edge { public: int start,end;//边的起始节点,终止节点 EdgeType weight;//边的权重(应该可以定义为int) Edge() { start=0; end=0; weight=0; } Edge(int st,int en,int w) { start=st; end=en; weight=w; } bool operator > (Edge oneEdge) { if(weight>oneEdge.weight) return true; else return false; } bool operator < (Edge oneEdge) { if(weight<oneEdge.weight) return true; else return false; } }; template<class EdgeType> class Graph { public: int vertexNum; //图中节点个数 int edgeNum; //图中边的个数 int * Mark; //标记某节点是否被访问 Graph(int verNum) { this->vertexNum=verNum; edgeNum=0; Mark=new int[vertexNum]; for(int i=0;i<vertexNum;i++) { Mark[i]=0; //都没有被访问过 } } ~Graph() { delete [] Mark; } //virtual Edge<EdgeType> FirstEdge(int oneVertex)=0; //virtual Edge<EdgeType> NextEdge(Edge<EdgeType> oneEdge)=0; int verticesNum() { return vertexNum; } int EdgesNum() { return edgeNum; } bool isEdge(Edge<EdgeType> oneEdge) { if(oneEdge.end>=0 && oneEdge.start>=0 && oneEdge.weight>0)//判断条件还不清楚 { return true; } else { return false; } } int startOfVertex(Edge<EdgeType> oneEdge) { return oneEdge.start; } int endOfVertex(Edge<EdgeType> oneEdge) { return oneEdge.end; } EdgeType weight(Edge<EdgeType> oneEdge) //返回oneEdge的权重 { return oneEdge.weight; } //virtual void setEdge(int start,int end,int weight)=0; //virtual void deleteEdge(int start,int end)=0; }; template<class EdgeType> class AdjGraph : public Graph<EdgeType > { private: int ** matrix; public: AdjGraph(int verNum):Graph<EdgeType>(verNum) { matrix =new int * [verNum]; for(int i=0;i<verNum;i++) { matrix[i]=new int [verNum]; } for(int i=0;i<verNum;i++) for(int j=0;j<verNum;j++) { matrix[i][j]=0; } } AdjGraph(int verNum,int ** a):Graph<EdgeType>(verNum) { matrix =new int * [verNum]; for(int i=0;i<verNum;i++) { matrix[i]=new int [verNum]; } for(int i=0;i<verNum;i++) for(int j=0;j<verNum;j++) { matrix[i][j]=a[i][j]; } } void disp() { for(int i=0;i<this->vertexNum;i++) { for(int j=0;j<this->vertexNum;j++) { cout<<matrix[i][j]<<" "; } cout<<endl; } } ~AdjGraph() { for(int i=0;i<this->vertexNum;i++) { matrix[i]=new int [this->vertexNum]; } delete [] matrix; } Edge<EdgeType> FirstEdge(int oneVer) //返回顶点的第一条边 { Edge<EdgeType> tem; tem.start=oneVer; for(int i=0;i<this->vertexNum;i++) { if(matrix[oneVer][i]!=0) { tem.end=i; tem.weight=matrix[oneVer][i]; return tem; //break; } } //cout<<"没有符合条件的边"<<endl; //return; } Edge<EdgeType> NextEdge(Edge<EdgeType> oneEdge)//返回与oneEdg有相同起点的下一条边 { Edge<EdgeType> tem; tem.start=oneEdge.start; for(int i=oneEdge.end+1;i<this->vertexNum;i++) { if(matrix[oneEdge.start][i]!=0) { tem.end=i; tem.weight=matrix[oneEdge.start][i]; return tem; } } //cout<<"没有符合条件的边"<<endl; //return; } void visit(int i) { cout<<"正在访问"<<i+1<<"号节点"<<endl; } //深度优先搜索 void DFS(int i)//从i号节点开始深度优先搜索 { this->Mark[i]=1; visit(i); for(Edge<EdgeType> e=FirstEdge(i);this->isEdge(e);e=NextEdge(e)) { if(this->Mark[e.end]==0) { DFS(e.end); } } } void DFSGraph()//对图进行深度优先搜索 { for(int i=0;i<this->vertexNum;i++) this->Mark[i]=0; //标记都未访问 for(int i=0;i<this->vertexNum;i++) { if(this->Mark[i]==0) { DFS(i); } } } //广度优先搜索 void BFS(int i)//从i号节点开始广度优先搜索 { Queue<int> que; que.EnQueue(i); visit(i); this->Mark[i]=1; int p; while(!que.IsEmpty()) { que.DeQueue(p); this->Mark[p]=1; for(Edge<EdgeType> e=FirstEdge(p);this->isEdge(e);e=NextEdge(e)) { if(this->Mark[e.end]==0) {//此处要注意,在节点入队时候就要将Mark置为已访问,否则可能会导致同一节点多次入队 visit(e.end); this->Mark[e.end]=1; que.EnQueue(e.end); } } } } void BFSGraph()//对图进行广度优先搜索 { for(int i=0;i<this->vertexNum;i++) this->Mark[i]=0; //标记都未访问 for(int i=0;i<this->vertexNum;i++) { if(this->Mark[i]==0) { BFS(i); } } } }; int main() { //课本p160页的图 int tem[8][8]={ {0,1,1,0,0,0,0,0}, {1,0,0,1,1,0,0,0}, {1,0,0,0,0,1,1,0}, {0,1,0,0,0,0,0,1}, {0,1,0,0,0,0,0,1}, {0,0,1,0,0,0,1,0}, {0,0,1,0,0,1,0,0}, {0,0,0,1,1,0,0,0}, }; int ** a=new int *[8]; for(int i=0;i<8;i++) { a[i]=new int [8]; } for(int i=0;i<8;i++) for(int j=0;j<8;j++) { a[i][j]=tem[i][j]; } AdjGraph<int> p(8,a); p.disp(); // p.DFSGraph(); p.BFSGraph(); return 0; }
相关文章推荐
- 【数据结构】邻接矩阵表示法的图的深度广度优先遍历递归和非递归遍历
- 【数据结构】邻接矩阵表示法的图的深度广度优先遍历递归和非递归遍历
- 图的邻接矩阵表示及深度、广度遍历
- 图的邻接矩阵存储表示 深度优先和广度优先遍历
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- 【数据结构】邻接矩阵的深度与广度遍历(无向图)
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- 图——广度优先遍历和深度优先遍历——邻接矩阵表示法
- 数据结构-图-邻接矩阵深度和广度遍历DFS_BFS
- 【数据结构】邻接表表示法的图的深度广度优先遍历递归和非递归遍历
- 数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历
- 图的邻接矩阵表示、广度优先遍历和深度优先遍历
- 图的邻接矩阵表示以及深度、广度优先遍历
- java 图的邻接矩阵表示,深度优先遍历,广度优先遍历
- 数据结构中用邻接矩阵方式储存图,广度优先,深度优先遍历
- 【数据结构】邻接矩阵深度和广度遍历DFS_BFS
- 数据结构-图-Java实现:有向图 图存储(邻接矩阵),最小生成树,广度深度遍历,图的连通性,最短路径
- java 图的邻接矩阵表示,深度优先遍历,广度优先遍历
- 数据结构 邻接矩阵深度及广度优先
- 数据结构图的数组表示法以及深度,广度遍历