• 图的表示方式


    图的表示方式可以有很多种,我们在平常使用的时候最常使用的有两种,一个是邻接矩阵法,另一个是邻接表法,下面着重介绍这两个方法。

    邻接矩阵法

    邻接矩阵法是采用一个N*N的矩阵G来存储图中边的情况,其中N的数目为图中结点的数目。
    具体的标记方法是若图中结点i和结点j之间有边则G[i][j]的值为1,否则为0,通过这种方法我们可以发现当我们存储无向图的时候,邻接矩阵是一个对称矩阵,我们可以压缩为一维矩阵来存储,依次来节省存储空间,元素对应关系为i*(i+1)/2+j;

    搜索时的代码主要如下所示:

    //深度优先搜索方式
    Class A{
          int [][]G;  //邻接矩阵
          int []visited; //访问标记数组
          public void fun(){
                for(int i=0;i<G.length;i++){
                      if(visited[i]==0)
                            dfs(i);
                }
          }
    
          private void dfs(int i){
                for(int j=0;j<G.length;j++){
                      if(G[i][j]==1&&visited[j]==0)
                      {
                            visited[j]=1;
                            dfs(j);
                      }
                }
          }
    }
    
    
    
    //广度优先搜索方式
    
    Class A{
          int [][]G;
          int []visited;
          
          public void BFS(){
                Queue<Integer> q=new Queue<>();
                for(int i=0;i<G.length;i++){
                      if(visited[i]==0){
                            q.offer(i);
                            visited[i]=1;
                      }
                      while(!q.isEmpty()){
                      int x=q.poll();
                      for(int j=0;j<G.length;j++){
                            if(G[i][j]==1&&visited[j]==0)
                                  q.offer(j);
                      }
                }
          }
    }
    
    

    邻接表法

    当图比较稀疏的时候,采用邻接矩阵方式就会造成空间的浪费,这时候可以采用邻接表的方法来表示。
    可以这样形象化的理解,一共有N行(N表示结点个数),每一行存储的为与该结点相邻的所有结点,也就是和该结点之间右边的结点。
    具体的代码如下:

    //在java中可以采用List<List<Integer>>这种数据结构来表示邻接表;
    Class A{
          List<List<Integer>> edges;
          int []visited;
          public void fun(){
                for(int i=0;i<n;i++)
                {
                      if(visited[i]==0;
                            dfs(i);
                }
          }
          
          private void dfs(int i){
                visited[i]=1;
                for(int x:edges.get(i))
                {
                      if(visited[x]==0)
                      {
                            dfs(x);
                      }
                }
          }
    }
    
    
    
  • 相关阅读:
    JVM问题定位分析(一)
    性能分析--上下文切换(context switch)
    JVM--如何通过软引用和弱引用提JVM内存使用效率
    docker挂载文件宿主机与容器内部数据不同步问题
    使iptables规则在CentOS 7中持久化
    dstat
    curl
    Django REST framework 之JWT认证
    【区别】摘要、数字签名、数字证书
    使用django.core.mail的EmailMultiAlternatives发送邮件a标签链接不生效问题
  • 原文地址:https://www.cnblogs.com/noob-l/p/13627834.html
Copyright © 2020-2023  润新知