您的位置:首页 > 理论基础 > 数据结构算法

图的邻接矩阵表示广度深度遍历大连理工大学数据结构上机

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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐