1. 程式人生 > >C++實現圖的鄰接矩陣的建立以及其深度優先遍歷和廣度優先遍歷

C++實現圖的鄰接矩陣的建立以及其深度優先遍歷和廣度優先遍歷

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