Мне нужно написать класс, который реализует следующий интерфейс:
public interface Graph<V> {
/**
* Adds vertex to the graph.
*/
boolean addVertex(V vertex);
/**
* Adds the edge (vertex1, vertex2) to the graph.
*/
boolean addEdge(V vertex1, V vertex2);
/**
* Return true if graph contains vertex.
*/
boolean hasVertex(V vertex);
/**
* Return true if graph contains the edge (vertex1, vertex2).
*/
boolean hasEdge(V vertex1, V vertex2);
/**
* Returns the line of vertices of the graph.
*/
ArrayList<V> vertices();
/**
* Returns the line adjacency of vertex.
*/
ArrayList<V> neighbors(V vertex);
}
Поэтому мне нужно создать класс, который позволяет вам создавать и редактировать ориентированный взвешенный график со списком смежности.
Моя проблема в том, что я не знаю, как начать. Я думал, что создам класс Edge, сделанный таким образом:
public class Edge {
public V v1; //first node
public V v2; //second node
public int weight; //edge weight
public Edge() {
v1 = "";
v2 = "";
peso = 0;
}
public Edge(V v1, V v2, int weight) {
this.v1 = v1;
this.v2 = v2;
this.weight = weight;
}
}
Затем я начал писать класс, который реализует SparseGraph Graph:
public class SparseGraph<V> implements Graph<V> {
public List<V> vertices = new ArrayList<V>(); //contains all the vertices (nodes)
public List<???> neighbors = new ArrayList<???>(); //adjacency lists
public SparseGraph<V>() {
//empty
}
public boolean addVertex(V vertex) {
return true;
}
public boolean addEdge(V vertex1, V vertex2) {
return true;
}
public boolean hasVertex(V vertex) {
return true;
}
public boolean hasEdge(V vertex1, V vertex2) {
return true;
}
public ArrayList<V> vertices() {
return null;
}
public ArrayList<V> neighbors(V vertex) {
return null;
}
}
Как я могу представить узел типа данных? В поставке говорится: "Граф должен быть определен на узлах общего типа V". Поэтому я создал отдельный класс Vertex. Но как мне создать граф, чьи узлы содержат (например) число? То есть, я хотел бы дать идентификатор узлам графика. Я делаю это во время тестирования, когда пишу:
SparseGraph<Integer> g = new SparseGraph<Integer>();
Я ошибаюсь? Теперь, как я представляю списки смежности?
Я очень смущен...
Спасибо всем, кто хочет мне помочь! PS: Мне не нужен код методов, я бы просто посоветовал, как создавать списки смежности.. и хотел бы знать, правильно ли остальная часть кода. Класс Edge может работать в сюда? Класс SparseGraph?
спасибо
Вы правы в создании экземпляра определенного типа вершин:
SparseGraph<Integer> g = new SparseGraph<Integer>();
Класс Edge
также должен содержать параметр типа V общего типа, поскольку он относится к нему.
public class Edge<V> ...
Наконец, график должен содержать список всех краев. Его можно сохранить в списке:
public List<Edge<V>> neighbors = new ArrayList<Edge<V>>();
Тем не менее, вы можете захотеть сохранить дополнительные структуры данных, чтобы эффективно hasEdge
методы neighbors
и hasEdge
. Например, вы можете иметь карту, чей ключ в Vertex (V) и значение которого представляет собой набор всех краев, которые начинаются или заканчиваются в этой вершине.