图的表示方式

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

邻接矩阵法

邻接矩阵法是采用一个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);
                  }
            }
      }
}


posted @ 2020-09-07 16:55  万物小白  阅读(885)  评论(0编辑  收藏  举报