深度优先遍历(Depth-First Traversal)
假设给定图G的初态是所有顶点均未曾访问过。在G中任选一顶点v为初始出发点(源点),则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被访问为止。若此时图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。
广度优先遍历
1、从图中某个顶点V0出发,并访问此顶点;
2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;
3、重复步骤2,直到全部顶点都被访问为止。
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 100
int visited[MAX];
typedef struct
{
int n,e;
int vex[MAX];
int edge[MAX][MAX];
}LJJZ;
//深度优先搜索
void dfs(LJJZ m,int v)
{
visited[v] = 1;
int j;
cout<<m.vex[v]<<" ";
for(j=0;j<m.n;j++)
{
if(m.edge[v][j]==1&&visited[j]==0)
dfs(m,j);
}
}
//广度优先收索
void bfs(LJJZ m,int v)
{
queue<int>q;
visited[v]=1;
cout<<m.vex[v]<<" ";
q.push(v);
while(!q.empty())
{
int x;
x=q.front();
q.pop();
for(int j = 0;j<m.n;j++)
{
if(m.edge[x][j]==1&&visited[j]==0)
{
visited[j]=1;
cout<<m.vex[j]<<" ";
q.push(j);
}
}
}
}
int main()
{
int A[MAX][MAX] =
{
{0,1,0,1,0,0},
{0,0,1,0,0,0},
{1,0,0,0,0,1},
{0,0,1,0,0,1},
{0,0,0,1,0,0},
{1,0,0,0,1,0}
};
LJJZ m;
m.n = 6;
m.e = 10;
int i,j;
for(i=0;i<m.n;i++)
for(j=0;j<m.n;j++)
{
m.edge[i][j] = A[i][j];
m.vex[i] = i;
}
//深度优先
for(i=0;i<m.n;i++)
visited[i] = 0;
for(i=0;i<m.n;i++)
{
if(visited[i]==0)
dfs(m,i);
}
cout<<endl;
//广度优先
for(i=0;i<m.n;i++)
visited[i] = 0;
for(i=0;i<m.n;i++)
{
if(visited[i]==0)
bfs(m,i);
}
return 0;
}