实验十二 图的建立与遍历

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(" ");     memset(vis, 0, sizeof(vis)); for(i = 0 ; i < n; i ++) { if(!vis[i]) { bfs(i, n); } } printf(" "); printf(" "); }  }
原文地址:https://www.cnblogs.com/herumw/p/9464855.html