图的遍历,对于dfs我们在主函数里面判断是否还有未遍历的点,然后dfs搜索,如果是旧点,我门就返回,如果不是我们就标记已搜,然后搜索这个点的邻接点。
这样做的好处就是可以遍历非连通的图,因为我们一个dfs结束的时候可能不能遍历所有的点,所以我们直接判断是否还有新点即可。
对于bfs也是一样,首先将队列置空,做初始化,然后搜索即可。
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
int AdjMatrix[100][100];
int vis[100];
queue<int> Q;
int n,m,s,e;
void dfs(int p)
{
if(vis[p])
return;
vis[p]=1;
printf("%3d", p);
for (int j = 1; j <= n;j++) {
if (AdjMatrix[p][j]) {
dfs(j);
}
}
}
void bfs()
{
while (!Q.empty()) {
int f = Q.front();
Q.pop();
for (int i=1;i<=n;i++) {
if (AdjMatrix[f][i]) {
if (!vis[i]) {
Q.push(i);
vis[i] = 1;
printf("%3d", i);
}
}
}
}
}
void enter()
{
memset(AdjMatrix, 0, sizeof(AdjMatrix));
memset(vis, 0, sizeof(vis));
cout << "Please enter the number of the point and the number of the edge." << endl;
scanf("%d%d", &n, &m);
printf("Please enter the adjacent point in turn.
");
for (int i = 0;i<m;i++) {
scanf("%d%d", &s, &e);
AdjMatrix[s][e] = 1;
}
}
int main()
{
enter();
for (int i = 1;i<=n;i++) {
if (!vis[i]) {
dfs(i);
}
}
printf("
");
enter();
for (int i=1;i<=n;i++) {
if (!vis[i]) {
while (!Q.empty())
Q.pop();
Q.push(i);
vis[i] = 1;
bfs();
printf("
");
}
}
return 0;
}
/*
实验数据(非连通)
5 3
1 2
2 3
4 5
连通图数据
5 4
1 2
2 3
3 4
4 5
*/