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;
}
測試如下
測試的結果是: