/**
* Copyright (c) 2011 Michael Kutschke.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Michael Kutschke - initial API and implementation.
*/
package org.eclipse.recommenders.jayes.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* undirected graph
*/
public class Graph implements Cloneable {
private final ArrayList<Integer>[] adjacency;
public int numberOfVertices() {
return adjacency.length;
}
@SuppressWarnings("unchecked")
public Graph(final int nodes) {
adjacency = new ArrayList[nodes];
for (int i = 0; i < nodes; i++) {
adjacency[i] = new ArrayList<Integer>();
}
}
public void addEdge(final int v1, final int v2) {
addOrdered(adjacency[v1], v2);
addOrdered(adjacency[v2], v1);
}
private void addOrdered(List<Integer> list, int v2) {
int i = Collections.binarySearch(list, v2);
if (i < 0) {
list.add(-i - 1, v2);
}
}
public void removeEdge(final int v1, final int v2) {
removeOrdered(adjacency[v1], v2);
removeOrdered(adjacency[v2], v1);
}
private void removeOrdered(List<Integer> list, int v2) {
int i = Collections.binarySearch(list, v2);
if (i >= 0) {
list.remove(i);
}
}
public void removeIncidentEdges(int v) {
for (int n : adjacency[v]) {
removeOrdered(adjacency[n], v);
}
adjacency[v].clear();
}
public List<Integer> getNeighbors(int var) {
return adjacency[var];
}
@SuppressWarnings("unchecked")
@Override
public Graph clone() {
try {
Graph clone = (Graph) super.clone();
for (int i = 0; i < adjacency.length; i++) {
clone.adjacency[i] = (ArrayList<Integer>) adjacency[i].clone();
}
return clone;
} catch (CloneNotSupportedException e) {
// should not happen
throw new AssertionError(e);
}
}
}