圖的構造和實現——鄰接矩陣[無向圖](c++)

//環境: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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章