Задать вопрос
@hana01

Как визуализировать графы в Java?

Допустим у меня есть код в java для построения Эйлерова цикла, необходимо это визуализировать. Java изучаю не так давно, знаю, пожалуй, только основы. Поиск необходимых средств для этого ни к чему конкретному не привёл, кроме советов попробовать использовать JavaFX. Я знаю, что он удобен для работы с графиками, но подойдёт ли для моих целей? Если нет, то что стоит использовать? И какую литературу посоветуете?
Код выглядит следующим образом:

package OZP;

import java.util.*;

public class Main {
static void dfs(List[] graph, int[] curEdge, ArrayList unusedEdges, List res, int u) {
while (curEdge[u] < graph[u].size()) {
int v = graph[u].get(curEdge[u]++);

boolean b = false;
for (Object o : unusedEdges) {
int[] a = (int[])o;
if ( (a[0] == u && a[1] == v) || (a[0] == v && a[1] == u) ) {
b = true;
unusedEdges.remove(o);
break;
}
}

if (b) dfs(graph, curEdge, unusedEdges, res, v);
}
res.add(u);
}

public static boolean[] BFS(boolean[][] adjacencyMatrix, int vertexCount, int givenVertex){
// Result array.
boolean[] mark = new boolean[vertexCount];

Queue queue = new LinkedList();
queue.add(givenVertex);
mark[givenVertex] = true;

while (!queue.isEmpty())
{
Integer current = queue.remove();

for (int i = 0; i < vertexCount; ++i)
if (adjacencyMatrix[current][i] && !mark[i])
{
mark[i] = true;
queue.add(i);
}
}

return mark;
}

public static List eulerCycleUndirected(List[] graph, int u, ArrayList unusedEdges) {
int n = graph.length;
int[] curEdge = new int[n];
List res = new ArrayList<>();
dfs(graph, curEdge, unusedEdges, res, u);
Collections.reverse(res);
return res;
}

public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.println("Введите кол-во вершин и рёбер (через пробел): ");
int v = s.nextInt(), e = s.nextInt();

ArrayList unusedEdges = new ArrayList();
boolean[][] adjacencyMatrix = new boolean[v][v];
System.out.println("Введите пары вершин соединённых ребром (через пробел): ");

List[] g = new List[v];
for (int i = 0; i < v; i++) g[i] = new ArrayList<>();
for (int i = 0; i < e; i++) {
int a = s.nextInt() - 1, b = s.nextInt() - 1;
unusedEdges.add(new int[]{a, b});
g[a].add(b);
g[b].add(a);

adjacencyMatrix[a][b] = adjacencyMatrix[b][a] = true;
}

boolean[] mark = BFS(adjacencyMatrix, v, 0);
for (int i = 0; i < mark.length; i++) {
if (!mark[i]) {
System.out.println("NONE");
return;
}
}

List res = eulerCycleUndirected(g, 0, unusedEdges);
if (res.get(0).equals(res.get(res.size() - 1))) {
for (int j = 0; j < res.size(); j++) System.out.print((res.get(j) + 1) + " ");
return;
}

System.out.println("NONE");
}

}
  • Вопрос задан
  • 196 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019 Куратор тега Java
Bigdata Engineer
Посмотри утилиту graphviz. Она позволяет красиво оформлять текстовые файлы с вершинами и ребрами в картинки.

Посмотри графический редактор yEd. Кажется у него были плагины и API для внешней разработки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы