zoukankan      html  css  js  c++  java
  • 实验十二 图的建立与遍历

    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(" "); }  }
  • 相关阅读:
    JavaWeb 之 表单重复提交问题
    JavaWeb 之 验证码
    JavaScript 之 AJAX 请求
    JavaWeb 之 i18N 国际化
    JavaWeb 之 Gson 的使用
    JavaScript 之 JSON 对象
    JavaWeb 之 由 Tomcat 展示友好的错误信息页面
    【LeetCode-动态规划】完全平方数
    【LeetCode-递归】至少有K个重复字符的最长子串
    【LeetCode-设计】常数时间插入、删除和获取随机元素
  • 原文地址:https://www.cnblogs.com/herumw/p/9464855.html
Copyright © 2011-2022 走看看