邻接表– 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>

