Сомнения в том, как представить граф со списками смежности

1

Мне нужно написать класс, который реализует следующий интерфейс:

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?

спасибо

Теги:
graph
adjacency-list

1 ответ

0
Лучший ответ

Вы правы в создании экземпляра определенного типа вершин:

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) и значение которого представляет собой набор всех краев, которые начинаются или заканчиваются в этой вершине.

  • 0
    Почему вы выбрали ArrayList вместо LinkedList?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню