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);
                      }
                }
          }
    }
    
    
    
  • 相关阅读:
    OS模块
    利用一个random模块生成一个随机验证码功能
    random模块
    模块2
    模块module
    Java笔记汇总
    学习路上——技术书籍摸爬滚打
    web前端知识汇总——持续更新
    Python之路——进入Python学习
    Python细节备忘——时常拾遗以及关键点
  • 原文地址:https://www.cnblogs.com/noob-l/p/13627834.html
Copyright © 2011-2022 走看看