有向图的定义和无向图基本相同:一幅有方向性的图是由一组节点和一组有方向的边组成的,每条有方向的边都连接着有序的一对顶点。有向图的数据类型如下:
public class Digraph
Digraph(int V) 创建一个V个节点0条边的有向图
int V() 获取有向图的节点数
int E() 获取有向图的边数
void addEdge(int v,int w) 添加一条v指向w的边
Digraph reverse() 该图的反向图
public class Digraph{
private int V;
private int E;
private Bag<Integer>[] adj;
//初始化
public Digraph(int V){
this.V = V;
adj =(Bag<Integer>[]) new Bag[V];
for(int i=0;i<V;i++){
adj[i] = new Bag<Integer>();
}
}
//添加一条v-->m的边
public void addEdge(int v, int m){
adj[v].put(m);
E++;
}
//获取边数
public int E(){
return E;
}
//获取节点数
public int V(){
return V;
}
//该有向图的反向图
public Digraph reverse(){
Digraph r = new Digraph(V);
for(int v=0;v<V;v++){
for(int w : adj(v)){
r.addEdge(w,v);
}
}
return r;
}
//获取该节点指向的所有节点
public Itearble<Integer> adj(int v){
return adj[v];
}
//下面为背包类的实现
private class Bag<Item> implements Iterable<Item>{
private Node first;
private int N;
private class Node{
Item item;
Node next;
}
public boolean isEmpty() {
return first==null;
}
public void put(Item item) {
Node oldFirst = first;
first = new Node();
first.item = item;
first.next = oldFirst;
N++;
}
private class BagIterator implements Iterator<Item>{
private Node f = first;
@Override
public boolean hasNext() {
return f!=null;
}
@Override
public Item next() {
Item item = f.item;
f = f.next;
return item;
}
}
@Override
public Iterator<Item> iterator() {
return null;
}
private class BIterator implements Iterator<Item>{
Node f = first;
@Override
public boolean hasNext() {
return f!=null;
}
@Override
public Item next() {
Item item = f.item;
f = f.next;
return item;
}
}
}
}