这里是根据老师给的参考代码重新写了一个关于图的遍历。
DFS使用递归,BFS使用队列。
代码如下:
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn = 100;
typedef struct{
char vexs[maxn]; //顶点表
int edges[maxn][maxn];//邻接矩阵
int n, e; //分别为顶点数和边数
}MGraph;
int visited[maxn];
/*建立邻接矩阵,并初始化*/
void CreateMGraph(MGraph &G)
{
char a;
printf("输入顶点数(n)和边数(e):");
scanf("%d%d", &G.n, &G.e);
getchar();
for(int i=0; i<G.n; i++)
{
scanf("%c", &a);
G.vexs[i] = a;
}
for(int i=0; i<G.n; i++)
{
visited[i]= 0;//初始化visited
for(int j=0; j<G.n; j++)
{
G.edges[i][j] = 0;
}
}
int s,t;
//建图
for(int i=0; i<G.e; i++)
{
scanf("%d%d", &s, &t);
G.edges[s][t] = 1;
G.edges[t][s] = 1;
}
}
/*对每个联通分量进行深度优先遍历*/
void DFSM(MGraph G, int i)
{
printf("%c",G.vexs[i]);
for(int j=0; j<G.n; j++)
{
if(G.edges[i][j] && !visited[j])
{
visited[j] = 1;
DFSM(G, j);
}
}
}
/*对整个图进行DFS*/
void DFS(MGraph G)
{
for(int i=0; i<G.n; i++)
{
if(!visited[i])
{//对于每个连通分量进行DFSM
visited[i] = 1;
DFSM(G, i);
}
}
}
/*顺序队列,即用数组表示队列*/
void BFS(MGraph G, int k)
{
int f=0, r=0;
int q[maxn];
for(int i=0; i<=G.n; i++)
{
visited[i] = 0;
q[i] = -1;
}
printf("%c", G.vexs[k]);
visited[k] = 1;
q[r] = k;
while(q[f] != -1)
{
int u = q[f];
f += 1;
for(int v=0; v<G.n; v++)
{
if(G.edges[u][v] && !visited[v])
{
printf("%c", G.vexs[v]);
visited[v] = 1;
r += 1;
q[r] = v;
}
}
}
}
int main()
{
MGraph G;
CreateMGraph(G);
DFS(G);
printf("\n");
BFS(G, 3);
return 0;
}