一、深度优先遍历(DFS)
深度优先遍历也成为深度优先搜索,简称DFS(Depth First Search) 从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图,直至图中所有和v有路径相通的顶点都被访问到。
类似于一个树的前序遍历(栈或递归的过程)
二、邻接矩阵的深度优先递归算法与遍历操作:
typedef int Boolean;
Boolean visited[MAX];
void DFS(MGraph G,int i)
{
int j;
visited[i]=TRUE;
printf("%c",G.vexs[i]);
for(j=0;j<G.numVertexes;j++)
if(G.arc[i][j]==1&&!visted[j])
DFS(G,j);
}
三、邻接矩阵的深度遍历操作与遍历操作:
void DFSTraverse(MGraph G)
{
int i;
for(i=0;i<G.numVertexes;i++)
visited[i]=FALSE;
for(i=0;i<G.numVertexes;i++)
if(!visited[i])
DFS(G,i);
}
四、广度优先遍历(BFS)
广度优先遍历又称为广度优先搜索,简称BFS
类似于树的层序遍历(队列渗透,之前写的队列层序建立二叉树)
typedef struct
{
int data[MAXSIZE];
int front;
int rear;
}Queue;
Status InitQueue(Queue *Q)
{
Q->front=0;
Q->rear=0;
return OK;
}
Status QueueEmpty(Queue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
}
Status EnQueue(Queue *Q,int e)
{
if ((Q->rear+1)%MAXSIZE == Q->front)
return ERROR;
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXSIZE;
return OK;
}
Status DeQueue(Queue *Q,int *e)
{
if (Q->front == Q->rear)
return ERROR;
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return OK;
}
五、邻接矩阵的广度遍历算法
void BFSTraverse(MGraph G)
{
int i, j;
Queue Q;
for(i = 0; i < G.numv; i++)
visited[i] = FALSE;
InitQueue(&Q);
for(i = 0; i < G.numv; i++)
{
if (!visited[i])
{
visited[i]=TRUE;
printf("%c ", G.vexs[i]);
EnQueue(&Q,i);
while(!QueueEmpty(Q))
{
DeQueue(&Q,&i);
for(j=0;j<G.numv;j++)
{
if(G.arc[i][j] == 1 && !visited[j])
{
visited[j]=TRUE;
printf("%c ", G.vexs[j]);
EnQueue(&Q,j);
}
}
}
}
}
}
六、 邻接表的广度遍历算法
void BFSTraverse(GraphAdjList *G)
{
int i;
EdgeNode *p;
Queue Q;
for(i = 0; i < G->numv; i++)
visited[i] = FALSE;
InitQueue(&Q);
for(i = 0; i < G->numv; i++)
{
if (!visited[i])
{
visited[i]=TRUE;
printf("%c ",G->adjList[i].data);
EnQueue(&Q,i);
while(!QueueEmpty(Q))
{
DeQueue(&Q,&i);
p = G->adjList[i].firstedge;
while(p)
{
if(!visited[p->adjvex])
{
visited[p->adjvex]=TRUE;
printf("%c ",G->adjList[p->adjvex].data);
EnQueue(&Q,p->adjvex);
}
p = p->next;
}
}
}
}
}
DFS和BFS模板
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#define maxn 10005
#define INF 0x3f3f3f3f
#define mm(a,x) memset(a,x,sizeof(a))
using namespace std;
int map[maxn][maxn],dfs_visited[maxn],bfs_visited[maxn];
int V,E;
void dfs(int i){
dfs_visited[i]=1;
cout<<" "<<i;
for(int j=0;j<V;j++){
if(map[i][j]&&!dfs_visited[j]){
dfs(j);
}
}
}
void bfs(int i){
queue<int> q;
bfs_visited[i]=1;
q.push(i);
cout<<" "<<i;
while(!q.empty()){
int p=q.front();
q.pop();
for(int j=0;j<V;j++){
if(map[p][j]&&!bfs_visited[j]){
cout<<" "<<j;
bfs_visited[j]=1;
q.push(j);
}
}
}
}
int main(){
cin>>V>>E;
for(int i=0;i<E;i++)
{
int c1,c2;
cin>>c1>>c2;
map[c1][c2]=map[c2][c1]=1;
}
for(int i=0;i<V;i++)
{
for(int j=0;j<V;j++)
{
cout<<map[i][j];
}
puts("");
}
mm(dfs_visited,0);
for(int i=0;i<V;i++)
{
if(!dfs_visited[i]){
cout<<"{";
dfs(i);
cout<<" }"<<endl;
}
}
mm(bfs_visited,0);
for(int i=0;i<V;i++)
{
if(!bfs_visited[i]){
cout<<"{";
bfs(i);
cout<<" }"<<endl;
}
}
return 0;
}