邻接表– Java/C ++的理论和实现

时间:2020-02-23 14:36:08  来源:igfitidea点击:

在本文中,我们谈论的是邻接列表(Adjacency List)。
图是边和顶点的集合。
这是表示节点网络的便捷方式。

编程时有多种表示图的方法。
邻接表是最受欢迎的表示形式之一。

在邻接列表表示下,图形表示为列表数组。
数组长度等于顶点数。
数组的每个块代表图形的一个顶点。
每个块包含特定顶点连接到的其他顶点的列表。

邻接表背后的想法

让我们看一个例子,以更好地理解它。
让图形如下所示:

这是一个无向图,这意味着边表示双向连接。

我们可以为有向图和无向图使用邻接表。
查看代码中的注释以查看区别。

上图的邻接表如下所示:

左侧显示阵列,右侧显示存储在阵列中的顶点列表。

邻接表的实现

为了实现邻接表,我们使用动态数组。
动态数组易于扩展。
我们的邻接列表将是数组列表的数组列表。
让我们来看一下代码。

要将边添加到邻接列表中,我们具有以下代码:

static void addEdge(ArrayList<ArrayList<Integer> > adj, int u, int v)
  {
      adj.get(u).add(v);
      adj.get(v).add(u);
      //if the graph is directed then only one statement is needed here
  }
</code>

由于我们正在考虑无向图,因此函数中有两个语句。
如果图形已定向,则从u到v的边将添加为:

static void addEdge(ArrayList<ArrayList<Integer> > adj, int u, int v)
  {
      adj.get(u).add(v);
  }
</code>

以下代码显示邻接表:

static void printGraph(ArrayList<ArrayList<Integer>> adj)
  {
      for (int i = 0; i < adj.size(); i++) {
          System.out.println("Adjacency list for vertex " + i);
          for (int j = 0; j < adj.get(i).size(); j++) {
              if (j!=0)
              System.out.print(" -> "+adj.get(i).get(j));
              else
                  System.out.print(adj.get(i).get(j));
          }
          System.out.println();
      }
  }
</code>

Java邻接表实现

package com.theitroad;

import java.util.ArrayList;

class GraphRep {
  //function to add the edge in Adj list
  static void addEdge(ArrayList<ArrayList<Integer> > adj,
                      int u, int v)
  {
      adj.get(u).add(v);
      adj.get(v).add(u);
      //if the graph is directed then only one statement is needed here
  }

  static void printGraph(ArrayList<ArrayList<Integer>> adj)
  {
      for (int i = 0; i < adj.size(); i++) {
          System.out.println("Adjacency list for vertex " + i);
          for (int j = 0; j < adj.get(i).size(); j++) {
              if (j!=0)
              System.out.print(" -> "+adj.get(i).get(j));
              else
                  System.out.print(adj.get(i).get(j));
          }
          System.out.println();
      }
  }
  public static void main(String[] args)
  {
      int V = 5;
      ArrayList<ArrayList<Integer> > graph
              = new ArrayList<>(V);

//creating array lists for storing lists        
for (int i = 0; i < V; i++)
          graph.add(new ArrayList<>());

      addEdge(graph, 0, 1);
      addEdge(graph, 0, 2);
      addEdge(graph, 1, 3);
      addEdge(graph, 1, 2);
      addEdge(graph, 3, 4);

      printGraph(graph);
  }
}
      
</code>

C ++中的邻接表实现

#include<bits/stdc++.h> 
using namespace std; 

//function to add the edge in Adj list
void addEdge(vector<int> adj[], int u, int v) 
{ 
  adj[u].push_back(v); 
  adj[v].push_back(u); 
 //if the graph is directed then only one statement is needed here
} 

void printGraph(vector<int> adj[], int V) 
{ 
  for (int v = 0; v < V; ++v) 
  { 
      cout << "\n Adjacency list for vertex "; 
      for (auto x : adj[v]) 
         cout << "-> " << x; 
      printf("\n"); 
  } 
} 
int main() 
{ 
  int V = 5; 
  vector<int> graph[V]; 
      addEdge(graph, 0, 1);
      addEdge(graph, 0, 2);
      addEdge(graph, 1, 3);
      addEdge(graph, 1, 2);
      addEdge(graph, 3, 4);
  printGraph(graph, V); 
  return 0; 
} 
</code>

输出

上面的代码输出为:

Adjacency list for vertex 0
1 -> 2
Adjacency list for vertex 1
0 -> 3 -> 2
Adjacency list for vertex 2
0 -> 1
Adjacency list for vertex 3
1 -> 4
Adjacency list for vertex 4
3
</code>