無向グラフを表すために隣接リストを使用するための汎用サンプルコードはどこから入手できますか?無向グラフの隣接リスト
グラフデータは.txtファイルになります。ノードはスペースで区切られた最初の行に指定されます。エッジは次の行で指定され、各エッジは別々の行に指定されます。このよう
...
1 2 3 4 5 6 7 8 9
1 2
1 4
1 3
2 4
2 5
3 6
4 6
5 7
5 8
6 9
7 9
8 9
私の.txtファイルには、グラフの方法で接続されていません。私はまた、次のNPEエラーを取得しています:
Error: java.lang.NullPointerException
は無向グラフのための標準的なグラフのADTの方法を実行する隣接リスト&を作成します。
//TON of imports up here (removed for now)
class Graph<V> implements GraphADT1 <V>{
// Map of adjacency lists for each node
private HashMap<Integer, LinkedList<Integer>> adj;
private ArrayList<V> vertices;
private HashMap<V, LinkedHashSet<V>> neighbors;
private HashMap<V, Set<V>> neighborsView;
private int edgeCount;
public Graph(int[] nodes) {
vertices = new ArrayList<V>();
neighbors = new HashMap<V, LinkedHashSet<V>>();
neighborsView = new HashMap<V, Set<V>>();
adj = new HashMap<Integer, LinkedList<Integer>>();
for (int i = 0; i < nodes.length; ++i) {
adj.put(i, new LinkedList<Integer>());
}
}
//Add Vertex Method
public void addVertex(V vid) {
vertices.add(vid);
LinkedHashSet<V> neighborV = new LinkedHashSet<V>();
neighbors.put(vid, neighborV);
neighborsView.put(vid, Collections.unmodifiableSet(neighborV));
}
// Removes Vertex Method
public void removeVertex(V vid) {
if(vertices.remove(vid)) {
LinkedHashSet<V> neighborV = neighbors.remove(vid);
for(V uid : neighborV) {
LinkedHashSet<V> neighborU = neighbors.get(uid);
neighborU.remove(vid);
--edgeCount;
}
neighborsView.remove(vid);
} else {
throw new NoSuchElementException("no such vertex");
}
}
//Add Edge Method
public void addEdge(V uid, V vid) {
LinkedHashSet<V> neighborU = neighbors.get(uid);
LinkedHashSet<V> neighborV = neighbors.get(vid);
if(neighborU == null) throw new NoSuchElementException("first argument not in graph");
if(neighborV == null) throw new NoSuchElementException("second argument not in graph");
if(neighborU.add(vid) && neighborV.add(uid)) {
++edgeCount;
}
}
//Remove Edge Method
public void removeEdge(V uid, V vid) {
LinkedHashSet<V> neighborU = neighbors.get(uid);
LinkedHashSet<V> neighborV = neighbors.get(vid);
if(neighborU == null) throw new NoSuchElementException("first argument not in graph");
if(neighborV == null) throw new NoSuchElementException("second argument not in graph");
if(neighborU.remove(vid) && neighborV.remove(uid)) {
--edgeCount;
} else {
throw new NoSuchElementException("no edge between vertices");
}
}
public void addNeighbor(int neighborV, int neighborU) {
adj.get(neighborV).add(neighborU);
}
public List<Integer> getNeighbors(int v) {
return adj.get(v);
}
public static void main(String[] args) {
try {
File file = new File("data.txt");
InputStreamReader streamReader = new InputStreamReader(
new FileInputStream(file));
BufferedReader br = new BufferedReader(streamReader);
String line = br.readLine();
if (line != null) {
// read nodes
String[] nodeNames = line.split(" ");
int[] nodes = new int[nodeNames.length];
for (int i = 0; i < nodes.length; ++i) {
nodes[i] = Integer.parseInt(nodeNames[i]);
}
// create graph
Graph V = new Graph(nodes);
// read edges
while ((line = br.readLine()) != null) {
String[] tokens = line.split(" ");
int neighborV = Integer.parseInt(tokens[0]);
int neighborU = Integer.parseInt(tokens[1]);
// we add neighbor to each node in both directions.
V.addNeighbor(neighborV, neighborU);
V.addNeighbor(neighborU, neighborV);
}
}
br.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
public Iterator<?> iteratorBFS(Object startVertex) {
return null;
}
public Iterator<?> iteratorDFS(Object startVertex) {
return null;
}
public boolean isEmpty() {
return size() == 0;
}
public boolean isConnected() {
return false;
}
public int size() {
return 0;
}
}
?このグラフはどのような形で得られますか?あなたの入力は何ですか? – user1084563
新しい情報をコメントではなく質問に追加します。 –
具体的には何を話していますか? – Tito