您的位置:首页 > 编程语言 > C语言/C++

C++实现图的邻接矩阵的创建以及其深度优先遍历和广度优先遍历

2014-11-01 20:42 856 查看
#include<iostream>
using namespace std;
typedef char vertextype;
typedef int edgetype;
#define maxvex 100
#define infinity 1000
#include<queue>
int visited[100];

class MGraph{

public:
vertextype vexs[maxvex];
edgetype arc[maxvex][maxvex];
int numvertexs,numedges;//图的顶点数目和图的边的数目
MGraph(const int &v,const int &e):numvertexs(v),numedges(e){}
void creategraph();//创建图结构
void displaygraph();//显示图的结构
void DFS(int i);//深度优先遍历的子函数
void DFSTraverse();
void BFSTraverse();//定义广度遍历算法

};
void MGraph::creategraph()
{  cout<<"下面请输入顶点的元素类型值,输入的个数为"<<numvertexs<<endl;
for(int i=0;i<numvertexs;++i)
{
cin>>vexs[i];
}
cin.clear();
cout<<"下面请为邻接矩阵赋值,矩阵的大小为:"<<numvertexs<<"*"<<numvertexs<<endl;
for(int i=0;i<numvertexs;++i)
{
for(int j=0;j<numvertexs;++j)
{
cin>>arc[i][j];
}
}

}
void MGraph::displaygraph()
{   cout<<"下面输出的是顶点中的元素"<<endl;
for(int i=0;i<numvertexs;++i)
{
cout<<vexs[i]<<" ";
}
cout<<endl;

for(int i=0;i<numvertexs;++i)
{
for(int j=0;j<numvertexs;++j)
{
cout<<arc[i][j]<<'\t';
}
cout<<endl;
}
}
//下面定义深度优先的函数
void MGraph::DFS(int i)
{
int j;
visited[i]=true;
cout<<"深度优先输出的结点信息"<<vexs[i]<<endl;
for(j=0;j<numvertexs;++j)
{
if(arc[i][j]==1&&!visited[j])
DFS(j);
}
}
void MGraph::DFSTraverse()
{
int i;
for(i=0;i<numvertexs;++i)
{
visited[i]=0;
}
for(i=0;i<numvertexs;++i)
{
if(!visited[i])
DFS(i);
}
}
void MGraph::BFSTraverse()
{
int i,j;
queue<int> q;
for(i=0;i<numvertexs;++i)
visited[numvertexs]=0;
for(i=0;i<numvertexs;++i)
{
if(!visited[i])
{
visited[i]=1;
cout<<"广度遍历的结点的信息为"<<vexs[i]<<endl;
q.push(i);
while(!q.empty())
{   int k;
k=q.front();
q.pop();
for(j=0;j<numvertexs;++j)
{
if(arc[i][j]==1&&!visited[j])
{
visited[j]=1;
cout<<"广度遍历的结点的信息为"<<vexs[i]<<endl;
q.push(j);
}
}
}
}

}

}
int main()
{    MGraph G(4,5);
G.creategraph();
G.displaygraph();
//G.DFSTraverse();
G.BFSTraverse();

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: