zoukankan      html  css  js  c++  java
  • 图的表示方式

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

    邻接矩阵法

    邻接矩阵法是采用一个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);
                      }
                }
          }
    }
    
    
    
  • 相关阅读:
    [Project Euler] Problem 58
    [Project Euler] Problem 59 Decrption
    [Project Euler] Problem 57
    VS2010 + WinDDK 搭建驱动开发环境
    利用C++模板特性计算各整数类型的最大最小值
    虚表的那些事儿
    ModuleNotFoundError: No module named 'pip._vendor.six'
    OpenCVPython系列之单应性查找对象理论篇
    OpenCVPython系列之背景分离
    OpenCVPython系列之Shi—tomasi拐角检测器
  • 原文地址:https://www.cnblogs.com/noob-l/p/13627834.html
Copyright © 2011-2022 走看看