Description
按邻接矩阵的方法创建图,分别用深度优先和广度优先方法遍历图。
Input
输入的数据有多组
对于每组测试数据第一行为图中点的个数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”);
} }