• 图论-图的遍历


    遍历是很多图论算法的基础,所谓图的遍历( graph traversal),也称为搜索( search),就是从图中某个顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次。     遍历可以采取两种方法进行:
            深度优先搜索( DFS: depth first search);
            广度优先搜索( BFS: breadth first search)。

    现在,提供几种图的遍历的方法。(注意有些代码不能实现有向图)

    算是遍历的模(mu)板吧!

    提供图:

    对应的测试数据:

    8 9
    1 2
    1 3
    2 4
    2 5
    3 6
    3 7
    4 8
    5 8
    6 7

    友情提示:注意比较一下几种方法输出的不同之处

    1.深搜:

      和深搜差不多,在深搜的基础上稍作处理即可;并且注意在访问过的上的标记;

    代码实现:

    用邻接矩阵:

     1 #include<iostream>
     2 using namespace std;
     3 #define N 2010
     4 int n,m;
     5 int map[N][N],vis[N];
     6 void dfs(int w)
     7 {
     8     vis[w]=1;
     9     cout<<w<<" ";
    10     for(int i=1;i<=n;++i)
    11     {
    12         if(!vis[i]&&map[w][i])
    13         {
    14             dfs(i);
    15             
    16         }
    17     }
    18 }
    19 int main()
    20 {
    21     cin>>n>>m;
    22     for(int i=1;i<=m;++i)
    23     {
    24         int x,y;
    25         cin>>x>>y;
    26         map[x][y]=1;
    27         map[y][x]=1;
    28     }
    29     dfs(1);
    30     return 0;
    31 }

    邻接链表:

     1 #include<iostream>
     2 using namespace std;
     3 #define N 2010
     4 int n,m;
     5 int map[N][N],vis[N];
     6 void dfs(int w)
     7 {
     8     vis[w]=1;
     9     cout<<w<<" ";
    10     for(int i=1;i<=map[w][0];++i)
    11     {
    12         if(!vis[map[w][i]])
    13         {
    14             dfs(map[w][i]);
    15         }
    16     }
    17 }
    18 int main()
    19 {
    20     cin>>n>>m;
    21     for(int i=1;i<=m;++i)
    22     {
    23         int x,y;
    24         cin>>x>>y;
    25         map[x][++map[x][0]]=y;
    26         map[y][++map[y][0]]=x;
    27     }
    28     dfs(1);
    29     return 0;
    30 }

    2.广搜的方法

      与广搜差不多,在广搜的基础上稍作调整即可;

    代码实现:

    邻接矩阵

     1 #include<iostream>
     2 using namespace std;
     3 #define N 2010
     4 int n,m;
     5 int team[N],map[N][N];
     6 bool vis[N];
     7 int head,tail;
     8 void bfs(int w)
     9 {
    10     vis[w]=1;
    11     team[tail++]=w;
    12     cout<<w;
    13     while(head<tail)
    14     {
    15         int d=team[head];
    16         head++;
    17         for(int i=1;i<=n;++i)
    18             if(!vis[i]&&map[d][i])
    19             {
    20                 cout<<" "<<i;
    21                 team[tail++]=i;
    22                 vis[i]=1;
    23             }
    24     }
    25 }
    26 int main()
    27 {
    28     cin>>n>>m;
    29     for(int i=1;i<=m;++i)
    30     {
    31         int x,y;
    32         cin>>x>>y;
    33         map[x][y]=1;
    34         map[y][x]=1;
    35     }
    36     bfs(1);//从1开始遍历 
    37     return 0;
    38 }

    邻接链表

     1 #include<iostream>
     2 using namespace std;
     3 #define N 2010
     4 int map[N][N];  
     5 bool vis[N];  //标记是否访问过 
     6 int team[N];  //队列 
     7 int n,m,head,tail; 
     8 void bfs(int w)
     9 {
    10     vis[w]=1;
    11     cout<<w;
    12     team[tail++]=w;
    13     while(head<tail)
    14     {
    15         int d=team[head];
    16         head++;
    17         for(int i=1;i<=map[d][0];++i)
    18         {
    19             if(!vis[map[d][i]])
    20             {
    21                 cout<<" "<<map[d][i]; 
    22                 team[tail++]=map[d][i];
    23                 vis[map[d][i]]=1;
    24             }
    25         }
    26     }
    27 }
    28 int main()
    29 {
    30     cin>>n>>m;
    31     for(int i=1;i<=m;++i)
    32     {
    33         int x,y;
    34         cin>>x>>y;
    35         map[x][++map[x][0]]=y;
    36         map[y][++map[y][0]]=x;
    37     }
    38     bfs(1);  //从1开始访问 
    39     return 0;
    40 }
  • 相关阅读:
    文本特殊符号汇集
    十大编程算法助程序员走上高手之路
    单例模式(Singleton)
    flink time and watermark
    关于maven依赖关系的问题
    幂等
    乐观锁和悲观锁的一个例子
    Elasticsearch logstash filter
    ELK filebeat的安装
    使用 Python 验证数据集中的体温是否符合正态分布
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6690011.html
Copyright © 2020-2023  润新知