圖的深度優先搜索和廣度優先搜索算法

 

DFS和BFS是圖論中應用最廣泛的兩種遍歷算法,

DFS 的思想就是不斷利用遞歸,去遍歷圖。

BFS藉助於隊列進行遍歷,一圈一圈的走

/**
圖論算法 
DFS 和BFS的標準代碼,以供參考 
*/
#include<iostream>
#include<bits/stdc++.h>
#include<queue> 
using namespace std;//注意命名空間的位置 
const int Max=100;
bool visited[Max];
int G[Max][Max];
int Nv;//dingdianshu
int Ne;//bianshu
queue<int> Q;

//對頂點V進行深度優先搜索 
void DFS(int v)
{
	visited[v]=true;
	cout<<v<<" ";
	for(int i=0;i<Nv;i++)
	{
		if(!visited[i])
		{
			if(G[i][v]||G[v][i])//
			{
				DFS(i);
			}
		}
	}
}
//對頂點V進行廣度優先搜索 
void BFS(int v)
{
	visited[v]=true;
	Q.push(v);
	int w;
	while(!Q.empty())
	{
		w=Q.front();
		Q.pop();
		cout<<w<<" ";
		for(int i=0;i<Nv;i++)
		{
			if(!visited[i])
			{
				if(G[i][w]||G[w][i])
				{
					visited[i]=true;//這裏代碼很關鍵!
					Q.push(i);
				}
			}
		}
	}
}
int main()
{
	cout<<"輸入邊數,頂點數"<<endl;
	cin>>Nv>>Ne;
	for(int i=0;i<Max;i++)
	{
		for(int j=0;j<Max;j++)
		{
			G[i][j]=0;
		}
	}
	int V,M;
	for(int i=0;i<Ne;i++)
	{
		cin>>V>>M;
		G[V][M]=1;
		G[M][V]=1;
	}
	memset(visited,false,sizeof(visited));
	cout<<"對圖進行廣度優先搜索"<<endl;
	for(int i=0;i<Nv;i++)//以免有的圖不連通, 
	{
		if(!visited[i])
		{
			cout<<"{";
			BFS(i);
			cout<<"}";
			cout<<endl;
		}
	}
	memset(visited,false,sizeof(visited));
	cout<<"對圖進行深度優先搜索"<<endl;
	for(int i=0;i<Nv;i++)
	{
		if(!visited[i])
		{
			cout<<"{";
			DFS(i);
			cout<<"}";
			cout<<endl;
		}
	}
	
	return 0;
}

 

 

測試如下

測試的結果是:

 

 

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