无向图的实现和一些常用算法(一)

812 查看

无向图的数据结构

Class Graph
private final int V;  边数
private int E; 边的数目
private Bag<Integer>[] adj; 邻接表,存储与该节点相邻的节点,一个链表数组

无向图的API

public class Graph
    Graph(int V)   创建一个含有V个节点但不含边的无向图
    Graph(In)    从输入流中读取一幅图
    int V()      返回图中有多少个节点
    int E()      边数
    addEdge(int v,int w)  添加一条边
    Iterable<Integer> adj(int v)   V节点相邻的所有顶点
    String toString       对象的字符串表示

实现很简单

package Graph;

import In.In;

public class Graph {
    private final int V;
    private int E;
    private Bag<Integer>[] adj;   //邻接表

    public Graph(int V){
        this.V = V;
        this.E = 0;
        adj = (Bag<Integer>[]) new Bag[V];
        for(int v = 0;v < V;v++){
            adj[v] = new Bag<Integer>();
        }
    }

    public Graph(In in){
        this(in.readInt());
        int E = in.readInt();
        for(int i = 0;i < E;i++){
            int v = in.readInt();
            int w = in.readInt();
            addEdge(v,w);
        }
    }

    public int V(){ return V;}
    public int E(){ return E;}

    public void addEdge(int v,int w){
        adj[v].add(w);
        adj[w].add(v);
        E++;
    }
    public Iterable<Integer>adj(int v){
        return adj[v];
    }

}

既然实现了图这种数据结构,那么接下来可以考虑图的处理算法了。见下一篇