Java-реализация списка смежности

У меня есть матрица n * m с целочисленным значением в каждом узле и ее неориентированный граф. Я хочу создать для него список смежности. Как я могу это сделать? Буду признателен за любую оказанную помощь.


person Jw123    schedule 09.02.2013    source источник
comment
Вы пробовали что-то? 2D массив?   -  person Jiri Kremser    schedule 09.02.2013
comment
Вы имеете в виду матрицу смежности?   -  person Jw123    schedule 09.02.2013
comment
Вам нужен массив, в котором каждая позиция представляет собой список понравившихся?   -  person dreamcrash    schedule 09.02.2013
comment
да, если целые числа в исходной матрице означают индексы узлов, на которые указывает ребро, то все готово. int[][], где первый индекс — это индекс узла, а хранящиеся там значения — узлы назначения. Если топология фиксирована, этого достаточно, если нет, вы можете рассмотреть возможность использования некоторой реализации List.   -  person Jiri Kremser    schedule 09.02.2013
comment
Это точно не показывает исследование. Википедия перечисляет только три возможных подхода к реализации.   -  person millimoose    schedule 09.02.2013


Ответы (2)


Вот простая реализация для создания списка смежности. Согласно проблеме:

Будет n связанных списков, каждый из которых имеет переменный размер.

Сначала инициализируйте ArrayList связанных списков целых чисел:

ArrayList<LinkedList<Integer>> adj_list = new ArrayList<LinkedList<Integer>>();

Затем просто добавьте связанные списки, повторив следующий код:

adj_list.add(new LinkedList<Integer>());

Если вы используете его для представления графа, то количество связанных списков = количество вершин. Таким образом, вы должны повторить приведенную выше строку n (количество вершин) раз.

Скажем, теперь вы хотите добавить числа 3,4,5 в свои первые связанные списки. Сделайте следующее:

adj_list.get(0).add(3);
adj_list.get(0).add(4);
adj_list.get(0).add(5);

Это просто означает, что в вашем графе есть ребро от вершины 0 до 3,4,5.

person Sumeet    schedule 26.01.2015
comment
Как нам поступить, если нам нужен взвешенный граф? - person Ayush Seth; 08.04.2017
comment
@MasterYushi здесь я нашел пример взвешенных ребер в графе с использованием javafx.util.Pair: theoryofprogramming.com/adjacency- список-в-java - person RichArt; 17.10.2017

Во-первых, ваше описание похоже на матрицу смежности, за исключением того, что вы говорите m на n. Матрицы смежности всегда квадратные, поэтому мы должны принять m==n. Элементы матрицы являются весами ребер.

Представление графа списком смежности (обычно) представляет собой массив adj наборов пар. Множество adj[i] содержит пару <j, w> тогда и только тогда, когда существует направленное ребро i--w-->j, т.е. из вершины i в j с весом w в представленном графе.

С этим определением становится ясно, что вы должны начать с n пустых наборов смежности adj[i], а затем пройтись по матричным элементам m[i][j] = w. Для каждого из них добавьте <j, w> к adj[i].

Java-код для этого довольно тривиален, поэтому я не буду его писать. Тип графа, представленного списками смежности, что-то вроде ArrayList<HashMap<Integer, Integer>> adjacencies. Пары <j,w> in adj[i] представляют собой сопоставления j -> w, хранящиеся в хэш-таблице adjacencies.get(i). Код для создания такой смежности будет adjacencies.get(i).put(j, w).

Этот метод позволяет перебирать вершины, соседние с i, перебирая ключи в хеш-таблице adjacencies.get(i), искать вес данного ребра i--w-->j с w = adjacencies.get(i).get(j) и т. д. для всех обычных операций с графом.

person Gene    schedule 09.02.2013
comment
Привет, Джин, Массив, содержащий данные, для которых я хочу построить матрицу смежности, равен m * n, где m! = n. - person Jw123; 09.02.2013
comment
Сколько вершин у вашего графа? n или m? Матрица смежности должна быть квадратной матрицей. Если у вас есть матрица n x m, вам наверняка не хватает некоторых ребер. - person Shiva Kumar; 09.02.2013
comment
Шива Кумар совершенно прав. Если вы @Jw123 используете прямоугольную матрицу, то это какое-то нестандартное представление графика, и вам придется объяснить, что представляет собой каждый элемент в вашей матрице, прежде чем кто-либо сможет вам помочь. Секрет получения хорошего ответа заключается в том, чтобы всегда задавать хороший вопрос. - person Gene; 09.02.2013