实验十二 图的建立与遍历
Description
按邻接矩阵的方法创建图,分别用深度优先和广度优先方法遍历图。
Input
输入的数据有多组
对于每组测试数据第一行为图中点的个数n(0 < n < 100)与边的数量m(m < =0)。
接下来有m行,每行两个整数a,b(0 <=a,b < n),代表这a,b这两个点之间是连通的。
对于每组测试数据第一行为图中点的个数n(0 < n < 100)与边的数量m(m < =0)。
接下来有m行,每行两个整数a,b(0 <=a,b < n),代表这a,b这两个点之间是连通的。
Output
分别输出按照深度优先搜索与广度优先搜索方法遍历的结果,每个输出结果后面都有一空行。
Sample Input
3 0
5 3
0 1
0 4
1 3
Sample Output
0 1 2
0 1 2
0 1 3 4 2
0 1 4 3 2
这题是简单的深搜和宽搜,因为宽搜加入点的时候vis[i]没有变为0,wa了好多次,一定要注意。。。深搜时候,vis不管加在dfs(i,n)前面还是dfs(i,n)之间都可以。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include <queue>
using namespace std;
int map[110][110],vis[1100];
void bfs(int u, int n) {
int i;
queue<int> qu;
qu.push(u);
while(!qu.empty()) {
int tmp = qu.front();
vis[tmp]=1;
qu.pop();
printf("%d ", tmp);
for(i = 0; i < n; i ++) {
if(i == tmp) continue;
if(map[tmp][i] && !vis[i]) {
vis[i] = 1; //这里一定要注意,不然会错的
qu.push(i);
}
}
}
}
void dfs(int u, int n)
{
int i;
vis[u] = 1;
printf("%d ", u);
for(i = 0; i < n; i ++)
{
if(i == u)
continue;
if(map[u][i]>0 && !vis[i])
{
dfs(i, n);
}
}
}
int main()
{
int n,m,a,b,i,j;
while(~scanf("%d%d",&n,&m))
{
memset(map,0,sizeof(map));
for(j=0;j<m;j++)
{
scanf("%d%d",&a,&b);
map[a][b]=map[b][a]=1;
}
memset(vis, 0, sizeof(vis));
for(i = 0 ; i < n; i ++)
{
if(!vis[i])
dfs(i, n);
}
printf("\n");
memset(vis, 0, sizeof(vis));
for(i = 0 ; i < n; i ++) {
if(!vis[i]) {
bfs(i, n);
}
}
printf("\n");
printf("\n");
}
}