====== Семинар 6 ====== Начальные сведения о графах можно найти {{:java:elective:kormen_p.88-91.pdf|здесь}}. ===== Задание 6.1 ===== Перед началом работы рекомендуется прочитать {{:java:elective:kormen_p.436-441.pdf|раздел 23.1}}. Приведем одну из возможных реализаций неориентированного графа в виде списков смежных вершин: import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class UndirectedGraph { private HashMap> verticesMap = new HashMap>(); public void addVertex(Integer vertexNumber){ if (!hasVertex(vertexNumber)) { verticesMap.put(vertexNumber, new ArrayList()); } } public boolean hasVertex(Integer vertexNumber) { return verticesMap.containsKey(vertexNumber); } public boolean hasEdge(Integer vertexNumber1, Integer vertexNumber2) { if (!hasVertex(vertexNumber1)) return false; List edges = verticesMap.get(vertexNumber1); return Collections.binarySearch(edges, vertexNumber2) >= 0; } public void addEdge(Integer vertexNumber1, Integer vertexNumber2) { if (!hasVertex(vertexNumber1)) addVertex(vertexNumber1); if (!hasVertex(vertexNumber2)) addVertex(vertexNumber2); List edges1 = verticesMap.get(vertexNumber1); List edges2 = verticesMap.get(vertexNumber2); edges1.add(vertexNumber2); edges2.add(vertexNumber1); Collections.sort(edges1); Collections.sort(edges2); } public Map> getVerticesMap() { return verticesMap; } } Пример использования класса ''UndirectedGraph'': Random random = new Random(); UndirectedGraph graph = new UndirectedGraph(); int numberOfVertices = 10; for(int i = 0; i < numberOfVertices; i++) // добавление вершин графа graph.addVertex(new Integer(i)); for(int i = 0; i < numberOfVertices; i++) for(int j = i + 1; j < numberOfVertices; j++){ // добавление ребер графа (случайным образом) if(random.nextBoolean()) graph.addEdge(new Integer(i), new Integer(j)); } Iterator iterator = graph.getVerticesMap().keySet().iterator(); Object key; while(iterator.hasNext()){// печать списков смежных вершин key = iterator.next(); System.out.println(key.toString() + ": " + graph.getVerticesMap().get(key).toString()); } Реализуйте алгоритм поиска в ширину, описанный в {{:java:elective:kormen_p.436-441.pdf|разделе 23.2}}.