实验十二 图的建立与遍历

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”);

}  }

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/Kirito_Acmer/article/details/44938021
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞