无向图的API
常用的图处理代码
图的几种表示方法
- 必须为可能在应用中碰到的各种类型的图预留出足够的空间;
- Graph的实例方法实现一定要快。
一、邻接矩阵
V*V布尔矩阵,顶点v和顶点w有相连接的边时,定义v行w列的元素值为true,否则为false。
二、边的数组
使用一个Edge类,含有两个int实例变量。
三、邻接表数组
使用一个以顶点为索引的列表数组,其中每个元素都是和该顶点相邻的顶点列表。
- 邻接表的数据结构
非稠密图的标准表示称为邻接表的数据结构,它将每个顶点的所有相邻顶点都保存在该顶点对应的元素所指向的一张链表中。
package algorithms;
import java.util.ArrayList;
public class Graph {
static void addEdge(ArrayList<ArrayList<Integer>> am, int s, int d){
am.get(s).add(d); //向每条链表中添加元素
am.get(d).add(s); //对称
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int V = 5;
ArrayList<ArrayList<Integer>> am = new ArrayList<ArrayList<Integer>>(V);
for(int i = 0; i < V; i++) {
am.add(new ArrayList<Integer>());
}
//add edges
addEdge(am,0,1); //索引对应的元素,新增元素
addEdge(am,0,2);
addEdge(am,0,3);
addEdge(am,1,2);
//每个顶点分别有3,2,2,1,0个元素
printGraph(am);
}
static void printGraph(ArrayList<ArrayList<Integer>> am) {
// TODO Auto-generated method stub
for(int i = 0; i < am.size(); i++) { //遍历第0、1、2、3、4条链表
System.out.println("\nVertex" + i + ":");
for(int j = 0; j < am.get(i).size(); j++) { //对于每条链表,遍历该链表所有元素
System.out.println("->"+am.get(i).get(j));
}
System.out.println();
}
}
}