1. 程式人生 > >演算法(13)DFS(深度優先遍歷)&BFS(廣度優先遍歷)——鄰接矩陣

演算法(13)DFS(深度優先遍歷)&BFS(廣度優先遍歷)——鄰接矩陣

        在網上看到的這段程式是用鄰接矩陣做的,有時間我會在後面用鄰接連結串列嘗試一下。

        程式碼來自    http://blog.csdn.net/qq_22335577/article/details/40684573

        不過這程式碼寫得並不是很完美,還有優化的可能,對程式碼做了一些改動,在原思路不變的基礎上。也做了一些註釋,更方便閱讀。

#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];    //這些資料還是用private比較好,封裝起來
	edgetype arc[maxvex][maxvex];
	int numvertexs,numedges;//圖的頂點數目和圖的邊的數目
	MGraph(const int &v,const int &e):numvertexs(v),numedges(e){}  //這個numedge完全沒有用到啊???
	void creategraph();//建立圖結構
	void displaygraph();//顯示圖的結構
	void DFS(int i);//深度優先遍歷的子函式
	void DFSTraverse();
	void MGraph::BFS(i);
	void BFSTraverse();//定義廣度遍歷演算法



};
void MGraph::creategraph()   //初始化頂點和鄰接矩陣
{  cout<<"please inpit vertex type:"<<numvertexs<<endl;
	for(int i=0;i<numvertexs;++i)
	{
		cin>>vexs[i];
	}
	cin.clear();
	cout<<"please initiate the matrix:"<<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<<"print the vertex:"<<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)  //這裡的i為頂點
{
	int j;
	visited[i]=true;
	cout<<"DFS info:"<<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的時候,已經訪問過了
			DFS(i);
	}
}

void MGraph::BFS(i)          //對一個頂點進行BFS
{
	if(!visited[i])          //同樣這句也是有必要的,確保沒有被訪問過
		{
			visited[i]=true;       
			cout<<"BFS info:"<<vexs[i]<<endl;
			q.push(i);
			while(!q.empty())    //queue不為空,即遍歷沒有完成
			{   int k;
				k=q.front();         //獲取隊首元素
				q.pop();		     //出佇列
				for(j=0;j<numvertexs;++j)
				{
					if(arc[i][j]==1&&!visited[j])  //判斷是否右邊,是否遍歷過
					{
						visited[j]=true;
						cout<<"BFS info:"<<vexs[i]<<endl;
						q.push(j);                //入隊
					}
				}
			}
		}
}

void MGraph::BFSTraverse()      //廣度遍歷
{
	int i,j;
	queue<int> q;               //設定queue,儲存遍歷到的頂點,通過入棧出棧遍歷
	for(i=0;i<numvertexs;++i)   //初始化所有的都未訪問
		visited[numvertexs]=0;
	for(i=0;i<numvertexs;++i)
	{		
		BFS(i);                 //呼叫了上面的子函式
	}

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

	system("pause");
	return 0;
}