MGraph.h
#ifndef MGRAPH_H
#define MGRAPH_H
#include <iostream>
using namespace std;
const int MaxSize = 50;
#define SetVisited() ResetVisited()
template <class DataType>
class MGraph
{
public:
MGraph(DataType a[],int n,int e);
~MGraph(){}
void DFSTraverse(int v);
void BFSTraverse(int v);
void SetVisited();
void PrintArc();
private:
int visited[MaxSize];
DataType vertex[MaxSize];
int arc[MaxSize][MaxSize];
int vertexNum,arcNum;
};
template <class DataType>
void MGraph<DataType>::PrintArc()
{
for(int i=0;i<vertexNum;i++)
{
for(int j=0;j<vertexNum;j++)
cout<<arc[i][j]<<" ";
cout<<endl;
}
}
template <class DataType>
void MGraph<DataType>::SetVisited()
{
for(int i=0;i<vertexNum;i++)
visited[i]=0;
}
template <class DataType>
MGraph<DataType>::MGraph(DataType a[],int n,int e)
{
int i=0,j=0,k=0;
vertexNum=n;
arcNum=e;
SetVisited();
for(i=0;i<vertexNum;i++)
vertex[i]=a[i];
for(i=0;i<vertexNum;i++)
for(j=0;j<vertexNum;j++)
arc[i][j]=0;
for(k=0;k<arcNum;k++)
{
cout<<"请输入边所依附的两个顶点(编号):"<<endl;
cin>>i>>j;
if(i>=vertexNum || j>=vertexNum)
{
cout<<"请重新输入:"<<endl;
cin>>i>>j;
}
arc[i][j] = 1;
arc[j][i] = 1;
}
}
template <class DataType>
void MGraph<DataType>::DFSTraverse(int v)
{
cout<<vertex[v]<<" ";
visited[v]=1;
for(int j=0;j<vertexNum;j++)
if(arc[v][j]==1 && visited[j] == 0) DFSTraverse(j);
}
template <class DataType>
void MGraph<DataType>::BFSTraverse(int v)
{
ResetVisited();
int Q[MaxSize];
int front,rear;
front=rear=-1;
cout<<vertex[v]<<" ";
visited[v]=1;
Q[++rear]=v;
while(front!=rear)
{
v=Q[++front];
for(int j=0;j<vertexNum;j++)
if(arc[v][j] == 1 && visited[j] == 0)
{
cout<<vertex[j]<<" ";
visited[j]=1;
Q[++rear]=j;
}
}
ResetVisited();
}
#endif
MGraph.cpp
#include "MGraph.h"
int main()
{
char ch[4] = {'a','b','c','d'};
cout<<"a(v0)- - - -(v3)d"<<endl;
cout<<"| / "<<endl;
cout<<"| / "<<endl;
cout<<"| / "<<endl;
cout<<"| / "<<endl;
cout<<"| / "<<endl;
cout<<"| / "<<endl;
cout<<"b(v1)- - - -(v2)c"<<endl;
MGraph<char> m(ch,4,4);
cout<<"该图用邻接矩阵存储\n";
cout<<"输出存储边的信息的二维数组\n";
m.PrintArc();
cout<<"输出深度优先遍历的结果:"<<endl;
m.DFSTraverse(0);
cout<<endl;
cout<<"输出广度优先遍历的结果:"<<endl;
m.BFSTraverse(0);
cout<<endl;
return 0;
}