Advertisement
maxim_shlyahtin

Коллок

May 31st, 2024
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.61 KB | None | 0 0
  1. Чтобы проверить, является ли граф минимальным (каждое ребро критическое), необходимо убедиться, что удаление любого ребра увеличивает количество компонент связности графа. Другими словами, каждое ребро должно быть мостом.
  2.  
  3. Вот как можно реализовать такую функцию на Java, используя предоставленный API для графа:
  4.  
  5. ```java
  6. import java.util.*;
  7.  
  8. public class GraphCheck {
  9.  
  10. public static boolean isGraphMinimal(Graph graph) {
  11. for (Edge edge : graph.getEdges()) {
  12. // Создаём копию графа без текущего ребра
  13. Graph modifiedGraph = removeEdge(graph, edge);
  14. if (isConnected(modifiedGraph)) {
  15. return false;
  16. }
  17. }
  18. return true;
  19. }
  20.  
  21. private static Graph removeEdge(Graph graph, Edge edgeToRemove) {
  22. List<Edge> newEdges = new ArrayList<>(graph.getEdges());
  23. newEdges.removeIf(edge -> edge.getFromV().equals(edgeToRemove.getFromV()) &&
  24. edge.getToV().equals(edgeToRemove.getToV()));
  25.  
  26. return Graph.builder()
  27. .setDirectType(graph.getDirectType())
  28. .setVertexCount(graph.getVertexCount())
  29. .setEdgeCount(newEdges.size())
  30. .setVertices(graph.getVertices())
  31. .setEdges(newEdges)
  32. .build();
  33. }
  34.  
  35. private static boolean isConnected(Graph graph) {
  36. if (graph.getVertexCount() == 0) {
  37. return true;
  38. }
  39.  
  40. Set<UUID> visited = new HashSet<>();
  41. Queue<UUID> queue = new LinkedList<>();
  42. UUID startVertex = graph.getVertices().keySet().iterator().next();
  43.  
  44. queue.add(startVertex);
  45. visited.add(startVertex);
  46.  
  47. while (!queue.isEmpty()) {
  48. UUID vertex = queue.poll();
  49. for (UUID neighbor : getNeighbors(graph, vertex)) {
  50. if (!visited.contains(neighbor)) {
  51. visited.add(neighbor);
  52. queue.add(neighbor);
  53. }
  54. }
  55. }
  56.  
  57. return visited.size() == graph.getVertexCount();
  58. }
  59.  
  60. private static List<UUID> getNeighbors(Graph graph, UUID vertexId) {
  61. List<UUID> neighbors = new ArrayList<>();
  62. for (Edge edge : graph.getEdges()) {
  63. if (edge.getFromV().equals(vertexId)) {
  64. neighbors.add(edge.getToV());
  65. }
  66. if (graph.getDirectType() == GraphType.UNDIRECTED && edge.getToV().equals(vertexId)) {
  67. neighbors.add(edge.getFromV());
  68. }
  69. }
  70. return neighbors;
  71. }
  72.  
  73. public static void main(String[] args) {
  74. // Пример создания графа
  75. Vertex v0 = Vertex.builder().setId(UUID.randomUUID()).build();
  76. Vertex v1 = Vertex.builder().setId(UUID.randomUUID()).build();
  77. Vertex v2 = Vertex.builder().setId(UUID.randomUUID()).build();
  78. Vertex v3 = Vertex.builder().setId(UUID.randomUUID()).build();
  79.  
  80. Edge e0 = Edge.builder().setFromV(v0.getId()).setToV(v1.getId()).build();
  81. Edge e1 = Edge.builder().setFromV(v0.getId()).setToV(v2.getId()).build();
  82. Edge e2 = Edge.builder().setFromV(v1.getId()).setToV(v2.getId()).build();
  83. Edge e3 = Edge.builder().setFromV(v2.getId()).setToV(v3.getId()).build();
  84.  
  85. Map<UUID, Vertex> vertices = new HashMap<>();
  86. vertices.put(v0.getId(), v0);
  87. vertices.put(v1.getId(), v1);
  88. vertices.put(v2.getId(), v2);
  89. vertices.put(v3.getId(), v3);
  90.  
  91. List<Edge> edges = new ArrayList<>();
  92. edges.add(e0);
  93. edges.add(e1);
  94. edges.add(e2);
  95. edges.add(e3);
  96.  
  97. Graph graph = Graph.builder()
  98. .setDirectType(GraphType.UNDIRECTED) // Или GraphType.DIRECTED
  99. .setVertexCount(vertices.size())
  100. .setEdgeCount(edges.size())
  101. .setVertices(vertices)
  102. .setEdges(edges)
  103. .build();
  104.  
  105. // Проверка, является ли граф минимальным
  106. boolean isMinimal = isGraphMinimal(graph);
  107. System.out.println("The graph is minimal: " + isMinimal);
  108. }
  109. }
  110. ```
  111.  
  112. ### Объяснение
  113.  
  114. 1. **Метод `isGraphMinimal`**:
  115. - Проверяет каждое ребро графа.
  116. - Удаляет ребро и проверяет, остался ли граф связным. Если граф остаётся связным после удаления хотя бы одного ребра, граф не является минимальным.
  117.  
  118. 2. **Метод `removeEdge`**:
  119. - Создаёт копию графа без указанного ребра.
  120.  
  121. 3. **Метод `isConnected`**:
  122. - Проверяет, является ли граф связным, используя поиск в ширину (BFS).
  123.  
  124. 4. **Метод `getNeighbors`**:
  125. - Возвращает список соседей для заданной вершины.
  126.  
  127. 5. **Пример использования**:
  128. - В методе `main` создаётся пример графа с вершинами и рёбрами, затем вызывается метод `isGraphMinimal`, и результат выводится на экран.
  129.  
  130. Этот код проверяет, является ли граф минимальным, используя предоставленный API.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement