//環境:vs2010
//MGraph.h
#ifndef MGraph_H //定義頭文件
#define MGraph_H
const int MaxSize = 10; //圖中最多頂點個數
template <class DataType>
class MGraph
{
public:
MGraph(DataType a[ ], int n, int e); //構造函數,建立具有n個頂點e條邊的圖
~MGraph( ) { } //析構函數爲空
void DFSTraverse(int v); //深度優先遍歷圖
void BFSTraverse(int v); //廣度優先遍歷圖
private:
DataType vertex[MaxSize]; //存放圖中頂點的數組
int arc[MaxSize][MaxSize]; //存放圖中邊的數組
int vertexNum, arcNum; //圖的頂點數和邊數
};
#endif
//MGraph.cpp
#include <iostream>
using namespace std;
#include "MGraph.h" //引入頭文件
template <class DataType>
MGraph<DataType>::MGraph(DataType a[ ], int n, int e)
{
int i, j;
vertexNum=n; arcNum=e;
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 (int k=0; k<arcNum; k++)
{
cout<<"請輸入邊的兩個頂點的序號:";
cin>>i;
cin>>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)
{
int Q[MaxSize];
int front = -1, rear = -1;int k; //初始化隊列,假設隊列採用順序存儲且不會發生溢出
cout << vertex[v]; visited[v] = 1; Q[++rear] = v; //被訪問頂點入隊
while (front != rear) //當隊列非空時
{
k= Q[++front]; //將隊頭元素出隊並送到v中
for (int j = 0; j < vertexNum; j++)
if (arc[k][j] == 1 && visited[j] == 0 ) {
cout << vertex[j];
visited[j] = 1;
Q[++rear] = j;
}
}
}
//MGraphmain.cpp
#include <iostream>
using namespace std;
#include "MGraph.cpp" //引用graph.cpp文件
int visited[MaxSize]={0};
int main( )
{
char ch[]={'A','B','C','D','E'};
MGraph<char> MG(ch, 5, 6);
for (int i=0; i<MaxSize; i++)
visited[i]=0;
cout<<"深度優先遍歷序列是:";
MG.DFSTraverse(1);
cout<<endl;
for (int i=0; i<MaxSize; i++)
visited[i]=0;
cout<<"廣度優先遍歷序列是:";
MG.BFSTraverse(0);
cout<<endl;
return 0;
}