AuD
Lecture 'Algorithmen und Datenstrukturen' (code examples)
GraphAM.java
Go to the documentation of this file.
1package aud.graph;
2
3import aud.Vector;
4import java.util.Iterator;
5import java.util.TreeSet;
6
13public class GraphAM<Node extends AbstractNode,Edge extends AbstractEdge>
14 extends AbstractGraph<Node,Edge>
15 implements Iterable<Node> {
16
17 AdjacencyMatrix<Edge> adj_ = null;
18 TreeSet<Node> nodes_ = null;
19
27 public GraphAM(Node nodeGenerator,Edge edgeGenerator,
28 boolean directed) {
29 super(nodeGenerator,edgeGenerator);
30
31 adj_=new AdjacencyMatrix<Edge>(!directed);
32 nodes_=new TreeSet<Node>();
33 }
34
35 @Override public boolean isDirected() {
36 return !adj_.isSymmetricMatrix();
37 }
38
39 @SuppressWarnings("unchecked")
40 @Override public Node addNode() {
41 Node node=(Node) nodeGenerator_.create();
42 node.graph_=this;
43 node.index_=nodes_.size();
44 nodes_.add(node);
45 return node;
46 }
47
48 @SuppressWarnings("unchecked")
49 @Override public Edge addEdge(Node source,Node destination) {
50 Edge edge=getEdge(check(source),check(destination));
51
52 if (edge!=null)
53 throw new RuntimeException("edge "+source.index()+
54 (isDirected() ? "->" : "--")+
55 destination.index()+" exists");
56
57 edge=(Edge) edgeGenerator_.create();
58 edge.graph_=this;
59 if (!isDirected() && source.index_>destination.index_) {
60 edge.dst_=source;
61 edge.src_=destination;
62 }
63 else {
64 edge.src_=source;
65 edge.dst_=destination;
66 }
67
68 adj_.set(source.index_,destination.index_,edge);
69
70 return edge;
71 }
72
73 @Override public int getNumNodes() { return nodes_.size(); }
74 @Override public Node getSomeNode() { return nodes_.first(); }
75
76 @Override public Iterator<Node> iterator() {
77 return (Iterator<Node>) nodes_.iterator();
78 }
79
80 @Override public Edge getEdge(Node source,Node destination) {
81 return adj_.get(source.index_,destination.index_);
82 }
83
84 @Override protected Node check(Node node) {
85 super.check(node); // additional assertion
86 assert(nodes_.contains(node));
87 return node;
88 }
89 @Override protected Edge check(Edge edge) {
90 super.check(edge); // additional assertion
91 assert(adj_.get(edge.src_.index_,edge.dst_.index_)==edge);
92 return edge;
93 }
94
95 @Override public Vector<Edge> getInEdges(Node node) {
96 return adj_.getColumnEntries(check(node).index_);
97 }
98 @Override public Vector<Edge> getOutEdges(Node node) {
99 return adj_.getRowEntries(check(node).index_);
100 }
101
102 @Override public void removeNode(Node node) {
103 adj_.clearColumnAndRow(check(node).index_);
104 boolean removed=nodes_.remove(node);
105 assert(removed);
106 }
107
108 @Override public void removeEdge(Edge edge) {
109 check(edge);
110 adj_.set(edge.src_.index_,edge.dst_.index_,null);
111 }
112
113 @Override public Iterator<Edge> getEdgeIterator() {
114 return adj_.iterator();
115 }
116}
Forward iterator.
Definition: Vector.java:213
Implementation of an array-based vector.
Definition: Vector.java:44
Interface to edges of a graph.
Interface to a graph.
Interface to nodes of a graph.
Sparse adjacency matrix.
Graph implementation based on adjacency matrix.
Definition: GraphAM.java:15
boolean isDirected()
Definition: GraphAM.java:35
Vector< Edge > getOutEdges(Node node)
Definition: GraphAM.java:98
Iterator< Edge > getEdgeIterator()
Definition: GraphAM.java:113
Iterator< Node > iterator()
Definition: GraphAM.java:76
Vector< Edge > getInEdges(Node node)
Definition: GraphAM.java:95
void removeEdge(Edge edge)
Definition: GraphAM.java:108
Edge getEdge(Node source, Node destination)
Definition: GraphAM.java:80
Edge check(Edge edge)
Definition: GraphAM.java:89
void removeNode(Node node)
Definition: GraphAM.java:102
Node getSomeNode()
Definition: GraphAM.java:74
Node check(Node node)
Definition: GraphAM.java:84
GraphAM(Node nodeGenerator, Edge edgeGenerator, boolean directed)
Create graph.
Definition: GraphAM.java:27
Edge addEdge(Node source, Node destination)
Definition: GraphAM.java:49
AuD lecture: Data structures, algorithms, examples.
Definition: A234Tree.java:1