Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача на графах, поиск сильно связанных компонент 
:(
    Опции темы
shtasik
  Дата 26.11.2003, 02:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ помогите горю!!!!!!!
Кто-нибудь знает алгоритм поиска сильно связанных компонент графа за линейное время!!!!!??
  Вверх
Fedor
Дата 27.11.2003, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: 2
Всего: 32



За линейное...? Попробую поискать... А ты пока зайди на http://algolist.manual.ru
Может там найдешь...


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Fixin
Дата 9.1.2004, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Тут такое дело, может поможет кто? Решил сделать задачку, но ума видно нехватает:
"В некоторой стране есть развитая сеть железных дорог. С
доисторических времён и до нашего времени в стране непрерывно
происходят военные перевороты, из-за которых в системе
железнодорожного транспорта этой страны происходят непрерывные
изменения. Дело в том, что во время очередного переворота некоторые
дороги разрушаются из-за военных действий, а пока новый
правитель некоторое время находится у власти, он восстанавливает
часть дорог.

Временами железнодорожная система в этой стране становилась довольно разветвленной,
поэтому некоторые города могли быть соединены двумя и более дорогами. Кроме того,
дорога могла начинаться и заканчиваться в одном и том же городе, причем для
одного города таких дорог могло быть несколько.

Инженер Джио проводит испытания новых сверхскоростных поездов.
Поскольку поезда экспериментальные, у них не должно
возникать трудностей при проезде через промежуточные города.
Поэтому инженер Джио требует, чтобы ни в каком городе на
пути поезда, кроме, может быть, начального и конечного, не было развилок.
Точнее, из любого промежуточного города на пути поезда должны выходить либо ровно
две дороги, ведущие в другие города (возможно, в один и тот же),
либо ровно одна дорога, начинающаяся
и заканчивающаяся в этом городе.

Естественно, что Джио желает испытать
поезд на максимальной возможной скорости, и поэтому после
каждого изменения в системе путей он хочет знать максимальную
длину пути, по которому может ехать поезд. Поскольку в
доисторические времена не умели добывать железо, в начале
никаких дорог между городами нет.

В первой строке входного файла находятся целые положительные
числа 1< n<500 - число городов в стране,
и 1<m<50000 - число изменений в железнодорожной системе.
В следующих m строках находится
информация об изменениях состояния системы путей. Каждое
изменение является либо добавлением дороги, либо удалением
дороги. В случае добавления дороги в очередной строке записан ноль, а затем идут
три целых числа. Первые два из них являются номерами городов,
соединяемых дорогой, а последнее является длиной добавленной
дороги. Города нумеруются целыми числам от 1 до n. Длина
дороги является целым положительным числом, не
превосходящим 10^6. В случае удаления дороги в очередной
строке сначала записана единица, а затем идёт номер шага,
на котором произошло добавление
удаляемой дороги.

Для каждого изменения системы путей выведите в очередную строку
выходного файла символ `*', если после очередного изменения
системы путей существует сколь угодно длинный путь,
удовлетворяющий условиям, поставленным Джио. В противном случае
выведите в выходной файл единственное целое число, являющееся
длиной максимального возможного пути.

Входнае данные:
5 16
0 2 3 4
0 3 4 3
0 1 2 1
0 5 5 4
1 1
1 4
0 4 1 4
0 4 5 1
0 1 4 1
1 7
0 1 5 7
1 2
1 3
1 8
1 9
1 11

Выходные:
4
7
8
*
*
3
8
5
4
3
8
9
*
8
7
0



Я подумал, что можно-бы исполизовать как основной объект не вершину (город), а ребро (жд) и записывать все данные о связи в структуру:
class tLink
{
private:
int CitiA;
int CitiB;
int Len;
int Stp; //шаг создания
};

Тогда связи от каждого города можно разложить на дерево, но с ним я работать не умею.
Подскажите кто-нибудь!
PM MAIL ICQ   Вверх
Fedor
Дата 9.1.2004, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: 2
Всего: 32



А на чем должна біть написана программа? Какой компилятор используется?


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Fixin
Дата 10.1.2004, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



В принципе мне важно разобраться в алгоритме поиска, а переделать могу и сам, но вообще я работаю на C++.
PM MAIL ICQ   Вверх
Fixin
Дата 10.1.2004, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Цитата
А на чем должна бiть написана программа?
В принципе мне важно разобраться в алгоритме поиска, а переделать могу и сам, но вообще я работаю на C++.
PM MAIL ICQ   Вверх
Fixin
Дата 10.1.2004, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Неудача вышла...smile.gif
PM MAIL ICQ   Вверх
acp
Дата 11.1.2004, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2



Задача подозрительно напоминает мне задачу с чемпионатов ACM. Подобная же, по крайней мере, постановка задачи... :-?

Статистика
Придумывал алгоритм - 5 минут.
Пытался сформулировать и записывал текст - 1 час.

Сначала определений несколько smile.gif

Уникальный маршрут - путь, который удовлетворяет условиям Джа.

Способ представления уникального маршрута в программе - обычный список вида
Код
PPathEl = ^PathEl;
PathEl = record
 //Индекс города
 Town : Integer;
 RLink : PPathEl;
end;

Например, для двух городов, соединённых уникальным маршрутом, список будет иметь два элемента.

Существует массив, в котором хранятся ссылки на сами уникальные маршруты. Например
Код
Path = record
 //Длина маршрута целиком
 Length : Integer;
 Link : PPathEl;
end;
RNet = array [1 .. 50000] of Path;


Ещё есть массив, в котором хранится степень инцедентности "вершин графа" (т.е. сколько дорог выходит из города)
Код
array [1 .. 500]


Что-то похожее на алгоритм:

Для каждой очередной строки (если добавление)

1. изменить массив степеней инцедентности соответствующим образом

2. обработать все маршруты и искать в них соответствующие города
- если город найден и степень инцедентности равна 2, то к данному маршруту приписывается этот путь и длина этого пути
- если город найден и степень инцедентности больше 2-х, то данный маршрут перестаёт быть уникальным и его надо разбить на два маршрута
- если город не найден (степень инцедентности изначально будет равна 0 или 1), то создаём новый уникальный маршрут

3. обработать "концевые" города маршрутов и если найдутся те маршруты, которые можно соединить, то сделать это.

4. отсортировать массив маршрутов по убыванию длин.

5. самый первый и будет максимальной длины маршрутом.

Для каждой строки (если удаление) - обрабатывать почти также.

P.S.
1. намешал паскалевский код с Object Pascal'евским кажется... smile.gif

2. я не думал насчёт максимальной длины массива маршрутов. Но, как я себе представляю, он может быть и не из 50000 элементов. А элементов всего из 500

3. не стал писать производительность алгоритма (она очевидна) - лень. Алгоритм несложный и достаточно нересурсоёмкий. Я вижу, кстати, путь к его ускорению - займись на досуге, если захочешь smile.gif

P.P.S. примерно ход мысли хоть понятен? smile.gif

Это сообщение отредактировал(а) acp - 11.1.2004, 23:34
PM WWW ICQ   Вверх
Fedor
Дата 12.1.2004, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: 2
Всего: 32



А обход вершин делать чем-то очень похожим на поиск в ширину. ИМХО


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
Fixin
  Дата 12.1.2004, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Цитата
P.P.S. примерно ход мысли хоть понятен?

Почитаю... Может разбирусь, я же проги делаю в Win API cool.gif , а с графами никогда... confused.gif

Цитата
Задача подозрительно напоминает мне задачу с чемпионатов...

Задача с какой-то олимпиады скачал, всеросийской что-ли, не помню. hmmm.gif

А пока, спасибо - может будут вопросы smile.gif
PM MAIL ICQ   Вверх
acp
Дата 13.1.2004, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2



Цитата
я же проги делаю в Win API

А я на ассемблере под WinAPI, но это не помешает реализовать подобный алгоритм.
Массив - он везде массив.
PM WWW ICQ   Вверх
Fixin
Дата 13.1.2004, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Цитата
P.P.S. примерно ход мысли хоть понятен? 

Нет, ничего не понял... Помоги еще раз: покажи всю программу.

Цитата
А я на ассемблере под WinAPI, но это не помешает реализовать подобный алгоритм.
Массив - он везде массив.


Асм - значит профи, а я листинги перепечатываю sad.gif .

Это сообщение отредактировал(а) Fixin - 13.1.2004, 19:33
PM MAIL ICQ   Вверх
acp
Дата 13.1.2004, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 4.2.2003
Где: Владимир

Репутация: нет
Всего: 2



Цитата
Помоги еще раз: покажи всю программу

В смысле? smile.gif
Программы нет. Это же только наметки кода алгоритма были...
PM WWW ICQ   Вверх
Fixin
Дата 14.1.2004, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: нет
Всего: 18



Ну тогда просто: "Спасибо", а то время потратили...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.