无向图

1. 无向图的概念

图由vertex和edge组成。即众多的vertex由edge相连接,就了图。
无向图中edge不指示方向,仅表示两个vertex是相互连接的关系。


2. 无向图数据结构的表示方法

我们用一维数组来表示无向图。具体方法是:
首先,数组的序号就可以代表无向图中的vertex。即有N个vertex,我们的数组就设置到N-1。
然后,每个vertex(即数组序号)对应内容是该vertex所有连接对象。我们用bag作为容器,保存到数组内。
代码如下:
import edu.princeton.cs.algs4.In;
import java.util.Iterator;

public class Graph
{
    private final int V;
    private int E;
    //最重要的数据结构,内容为bag的数组。
    private Bag<Integer>[] adj;

    //输入vertex的个数V,生成长度为V的数组,内容(bag)为空。
    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>();
    }

    //这个是根据输入的文本而进行操作,详情见edu.princeton.cs.algs4.In。
    //首先读取vertex的个数V,执行上面的constructor。然后读取edge的个数E。
    //读取每一对连接着的vertex,分别在其对应的包内将对方添加进去。
    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);
        }
    }

    //互相将对方添加到自己的包内。注意edge又重新加了一遍。
    public void addEdge(int v, int w)
    {
        adj[v].addElement(w);
        adj[w].addElement(v);
        E++;
    }

    public int V()
    { return V; }

    public int E()
    { return E; }

    public Iterable<Integer> adj(int v)
    { return adj[v]; }
}

//自己定义的bag。
class Bag<T> implements Iterable<T>
{
    private Node first;
    private int N = 0;

    private class Node
    {
        T item;
        Node next;
    }

    public void addElement(T item)
    {
        if (first == null) {
            first = new Node();
            first.item = item;
        } else {
            Node oldFirst = first;
            first = new Node();
            first.item = item;
            first.next = oldFirst;
        }

        N++;
    }

    public Iterator<T> iterator()
    { return new MyIterator(); }

    class MyIterator implements Iterator<T>
    {
        Node begin = first;

        public boolean hasNext()
        { return begin == null; }

        public T next()
        {
            T item = begin.item;
            begin = begin.next;
            return item;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/anonymous2011/article/details/79726892
今日推荐