Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2017, 13:48   #1
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
Лампочка Графы

Добрый день. Возник вопрос: как хранить графы в коллекциях, не в двумерных массивах.

А вопрос возник вот почему. Искал реализацию поиска в глубина на JAVA и в викиучебнике написано:

Код:
List<Integer>[] graph = readGraph();
boolean[] used = new boolean[graph.length];

public static void dfs(int pos) {
    used[pos] = true;
    System.out.println(pos);
    for (int next : graph[pos])
        if (!used[next])
            dfs(next);
}
Реализация, разумеется, верна. Но мне непонятно, как здесь хранится сам граф.

P.S. другими словами, напишите метод readGraph();
NikiToZz_ вне форума Ответить с цитированием
Старый 24.08.2017, 14:49   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

https://ru.wikipedia.org/wiki/%D0%A1...81%D1%82%D0%B8

Причем тут Java?.. Это ж базовые вещи из математики или только из-за кода...
p51x вне форума Ответить с цитированием
Старый 24.08.2017, 16:46   #3
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
https://ru.wikipedia.org/wiki/%D0%A1...81%D1%82%D0%B8

Причем тут Java?.. Это ж базовые вещи из математики или только из-за кода...
Мой вопрос вроде бы понятен) Мне нужно увидеть реализацию с ArrayListom, а не ссылочку на список смежности в вики)
NikiToZz_ вне форума Ответить с цитированием
Старый 24.08.2017, 16:50   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Что там не понятно? В файле/пользовательском вводе/на луне как-то записаны списки смежности, например, так:
Код:
2 3
4
5
1 2
Вот каждая строка и получается ArrayList.

P.S. Конечно, вы всегда можете обратиться в раздел фриланса и за вас напишут один из вариантов.
p51x вне форума Ответить с цитированием
Старый 24.08.2017, 17:01   #5
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что там не понятно? В файле/пользовательском вводе/на луне как-то записаны списки смежности, например, так:
Код:
2 3
4
5
1 2
Вот каждая строка и получается ArrayList.

P.S. Конечно, вы всегда можете обратиться в раздел фриланса и за вас напишут один из вариантов.
Допустим, у меня есть такой список смежности.
Код:
1 2
1 3
2 4
т.е. у графа 4 вершины.

Я пишу такую реализацию, чтобы позже пройтись по списку dfsом, описанным выше:

Код:
public static ArrayList<Integer>[] readGraph() {
        ArrayList<Integer>[] graph = new ArrayList[num];
        for (int i = 0; i < (num - 1); i++) {
            graph[i] = new ArrayList<Integer>();
        }

        for (int i = 0; i < num; i++) {
            int arI = scan.nextInt();
            int arJ = scan.nextInt();
            graph[arI].add(new Integer(arJ));
        }
        return graph;
    }
В итоге в ArrayList у меня, судя по всему, получается немного не то, что мне хотелось бы видеть для dfs.
NikiToZz_ вне форума Ответить с цитированием
Старый 24.08.2017, 17:10   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Давайте с простого: что такое num и чему он равен? Предполагаю, что количество вершин и 4, тогда:
Код:
for (int i = 0; i < num; i++) {
сколько строк вы тут считываете и сколько в файле?
p51x вне форума Ответить с цитированием
Старый 24.08.2017, 17:15   #7
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Давайте с простого: что такое num и чему он равен? Предполагаю, что количество вершин и 4, тогда:
Код:
for (int i = 0; i < num; i++) {
сколько строк вы тут считываете и сколько в файле?
Копировал разные участки кода, поэтому так получилось.. там везде до num - 1. Проблема не в том, что я не могу создать arrayList со списка смежности. Проблема моя состоит в том, что после того, как создаю этот самый ArrayList, и я запускаю dfs. У меня вылетает исключение ArrayIndexOutOfBoundsException
NikiToZz_ вне форума Ответить с цитированием
Старый 24.08.2017, 17:18   #8
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Давайте с простого:
Давайте. Объясните, почему в dfs на вики берется именно массив коллекций?

Код:
List<Integer>[] graph = readGraph();
Как, по их мнению, должен храниться граф?
NikiToZz_ вне форума Ответить с цитированием
Старый 24.08.2017, 17:23   #9
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Опередили, пока писал..

Цитата:
Сообщение от NikiToZz_ Посмотреть сообщение
Реализация, разумеется, верна.
Но там нет никакого условия завершения поиска.

Цитата:
Сообщение от NikiToZz_ Посмотреть сообщение
Допустим, у меня есть такой список смежности.
Судя по дальнейшему коду, это список рёбер, а не смежности.

Цитата:
Сообщение от NikiToZz_ Посмотреть сообщение
Я пишу такую реализацию
Тут явная проблема вокруг num.
1) Как-то не очень правильно заводить массив размером num в которм инициализировать только первые (num-1) членов.
2) Насколько я понял, num - количество вершин, но ведь количество рёбер никак с ним не связано, почему второй цикл тоже до num?
Black Fregat вне форума Ответить с цитированием
Старый 24.08.2017, 17:25   #10
NikiToZz_
Пользователь
 
Регистрация: 23.04.2016
Сообщений: 75
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
2) Насколько я понял, num - количество вершин, но ведь количество рёбер никак с ним не связано, почему второй цикл тоже до num?
Там везде до (num-1). моя описка

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Но там нет никакого условия завершения поиска.
Код:
if (!used[next])
-- оно и есть

Последний раз редактировалось NikiToZz_; 24.08.2017 в 17:28.
NikiToZz_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графы (с++) Ikol Помощь студентам 0 04.12.2011 20:52
Графы DTroy Помощь студентам 0 24.11.2011 20:28
графы! Daniya.ru Общие вопросы C/C++ 6 09.12.2010 21:16
Графы в С++ skiffter Помощь студентам 3 11.04.2010 10:40
графы delete Общие вопросы C/C++ 2 28.10.2009 21:31