这里写的是无向图的遍历方法,BFS与DFS。
BFS主要是借助了一个队列q,开始时将根结点压入队列,并标记为已访问,当队列不为空时做以下循环:
1.输出队首结点
2.取队列队首元素,遍历n个结点,如果队首结点与该结点有边且该结点为被访问,将该结点压入队列中,并标记该结点。
DFS则是利用递归思想,需要在函数体外建立一个visit[n+1]数字。
对于结点i,访问结点i,并标记结点i已访问遍历n个结点,如果结点j与结点i有边且结点j未访问,则递归调用DFS[j]。
代码:
#include <iostream>
#include <queue>
using namespace std;
const int n = 12;
//无向图
int graph[n+1][n+1]=
{
// 0 1 2 3 4 5 6 7 8 9 10 11 12
/*0*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
/*1*/ { 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
/*2*/ { 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 },
/*3*/ { 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
/*4*/ { 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
/*5*/ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
/*6*/ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
/*7*/ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 },
/*8*/ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0 },
/*9*/ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0 },
/*10*/ { 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1 },
/*11*/ { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1 },
/*12*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }
};
void BFS(int origin)
{
bool visit[n+1]={false};
queue<int>q;
q.push(origin);
visit[origin] = true;
while(!q.empty())
{
int front = q.front(); //队首元素
cout<<front<<" "; //输出队首元素
q.pop(); //弹出队首元素
for(int j=1;j<=n;j++) //遍历与队首元素相连的结点
if(graph[front][j] != 0 && !visit[j]) //若未访问过,则压入队列中
{q.push(j);visit[j]=true;}
}
}
bool DFS_visit[n+1]={false};
void DFS(int origin)
{
cout<<origin<<" ";
DFS_visit[origin] = true;
for(int i=1;i<=n;i++)
{
if(graph[origin][i] != 0 && !DFS_visit[i])
DFS(i);
}
}
int main()
{
int origin; //起点
cin>>origin;
BFS(origin);
cout<<endl;
DFS(origin);
cout<<endl;
return 0;
}