无向图邻接表实现

图是由一组顶点和一组能够将两个顶点相连的边组成,使用邻接表来组建,即使用一个背包数组来实现。节点由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;
            }

        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37520037/article/details/82056073