图是由一组顶点和一组能够将两个顶点相连的边组成,使用邻接表来组建,即使用一个背包数组来实现。节点由0带V-1组成,节点数为V,边数为E.
API:
public class Graph
Graph(int V) 创建一个含有V个顶点但不含边的无向图
int V() 顶点数
int E() 边数
void addEdge(int v , int w) 向图中添加一条边, v-m
Iterable adj(int v) 返回和v顶点相连的所有顶点
代码实现:
public class Graph{
private Bag<Integer>[] adj; //邻接表
private int V; //顶点数
private int E; //边数
public Graph(int V){
this.V = V;
adj = (Bag<Integer>[]) new Bag[V};
for(int i=0;i<V;i++){
adj[i] = new Bag<Integer>();
}
}
public void addEdge(int v ,int w){
adj[v].push(w);
adj[w].push(v);
E++;
}
public int V(){
return V;
}
public int E(){
return E;
}
public Iterable<Integer> adj(int v){
return adj[v];
}
//下面为背包结构
private class Bag<Item> implements Iterable<Item>{
Node first;
int N;
class Node<Item>{
Item item;
Node next;
}
public void push(Item item){
Node oldFirst = first;
first = new Node();
first.item = item;
first.next = oldFirst;
N++;
}
public boolean isEmpty() {
return first==null;
}
@Override
public Iterator<Item> iterator() {
return new MIterator();
}
private class MIterator implements Iterator<Item>{
Node f = first;
@Override
public boolean hasNext() {
return f!=null;
}
@Override
public Item next() {
Item item = (Item) f.item;
f = f.next;
return item;
}
}
}
}