Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67

Динамический граф, поиск в ширину

29.04.2014, 20:57. Показов 6585. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!

Создал динамическим путём граф и проверил его там же.
Но вот с поиском в ширину у меня какая-то проблема.

точнее так: логический смысл поиска я понял, но не могу понять, как бы мне записывать путь, при условии, что у меня обычный граф (вероятно, в нём могут быть циклы, или, например, представить, что он дерево, а потом его листы снова в корень - ну что-то такое, граф в общем, или я не правильно представляю себе работу графа и только усложняю задачу?)

Собственно вот код "графа и поиска в ширену".

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
mark_list = []  # список вершин, в которых мы уже были
queue_list = []  # очередь, т.е. список вершин. которые нам нужно посмотреть
path_list = [] # типа "путь" от вершины А к Б
 
class prpr:
    
    def __init__(self, name):
        self.listvertex = []  # список вершин, которые соединены с этой вершиной
        self.name = name # имя вершины
 
def add_vertex (self, graph_obj): # ф-я добавление вершины
    self.listvertex.append(graph_obj)  
    
      
def search_vertex(self, search_graph_obj): # ф-я поиска в ширину
    find_vertex =  search_graph_obj in self.listvertex
    if (self.name != search_graph_obj.name):
        mark_list.append(self)
        while len(queue_list) != 0:
            queue_list.pop(0)
            if len(self.listvertex) != 0:
                for i in self.listvertex:
                    queue_list.append(i)
                while len(queue_list) != 0 and queue_list[0] in mark_list:
                    queue_list.pop(0)
                if len(queue_list) != 0:
                    search_vertex(queue_list[0], search_graph_obj)
            else:
                break
    else:
        queue_list.pop(0)
    if len(path_list) != 0 and path_list[len(path_list)-1] in self.listvertex:
        path_list.append(self)
    if find_vertex == True:
        path_list.append(self)
 
 
        
 
 
# просто сделал граф  в ручную и проверил его    
 
sd = prpr("sd")
print (sd.name)
 
qw = prpr("qw")
add_vertex(sd,qw)
 
#qwt = prpr("qwt")
#add_vertex(sd,qwt)
 
##dffa = prpr("dffa")
#add_vertex(qwt,dffa)
 
we = prpr("we")
add_vertex(qw,we)
 
df = prpr("df")
add_vertex(qw,df)
 
wer = prpr("wer")
add_vertex(df,wer)
 
#dff = prpr("dff")
#add_vertex(wer,dff)
 
#add_vertex(dffa,dff)
#add_vertex(we,wer)
 
queue_list.append(sd)
search_vertex(sd, wer)
 
#mark_list.clear() 
#queue_list.clear()
но вот с путём что-то не так.
Не могу придумать что и как там отслеживать, чтобы корректный путь записать.

Добавлено через 5 часов 50 минут
update
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.04.2014, 20:57
Ответы с готовыми решениями:

Бинарное дерево. Граф. Поиск в ширину
Помогите интернет-магазину! Магазин имеет связь с социальной сетью, и когда кто-то покупает в ней какой-то товар, то эта информация...

Граф. Поиск в ширину
Добрый день! Помогите, пожалуйста, выполнить поиск в ширину из вершины V11 ...

Поиск в ширину. Граф.
Здравствуйте, собственно задача: в графе найти кратчайший путь от А до B. На основе FAQ'ка накопипастил некоторый код, но как сделать сам...

4
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
01.05.2014, 18:30  [ТС]
update
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
02.05.2014, 17:58
Лучший ответ Сообщение было отмечено YYwww как решение

Решение

Что-то тут слишком запутанно... Мой вариант:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from collections import deque
    
def build_path(src, dst, prev):
    path = [dst]
    cur = dst
    while cur is not src:
        cur = prev[cur]
        path.append(cur)
    return reversed(path)
 
def bfs(src, dst=None):
    queue = deque((src, ))
    previous = {src: None}
    while len(queue) != 0:
        cur = queue.popleft()
        for v in cur.listvertex:
            if v not in previous:
                previous[v] = cur
                queue.append(v)
                if v is dst:
                    return previous
    return previous
 
...
for v in build_path(sd, wer, bfs(sd, wer)):
    print v.name
2
1 / 1 / 0
Регистрация: 06.06.2013
Сообщений: 67
02.05.2014, 23:36  [ТС]
объясните мне только что такое:

что тут подключили?
Python
1
from collections import deque
эта функция (вкратце) что делает?
Python
1
def bfs(src, dst=None):
и для чего эта переменная?
Python
1
previous

Буду разбирать ваш код
огромное Вам спасибо!
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
03.05.2014, 10:31
https://docs.python.org/2/libr... ue-objects
В общем-то для очереди можно использовать и list, но это неоптимально, так как это по сути непрерывный массив, и при удалении элемента из него приходится сдвигать все последующие. А deque (double-ended queue) как раз для таких вещей подходит.
bfs (breadth-first search) непосредственно осуществляет поиск в ширину из вершины src, возвращает previous; если ещё указать dst, то поиск остановится, когда доходит до dst.
previous[v] - последняя вершина пути от src к v.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2014, 10:31
Помогаю со студенческими работами здесь

Бинарное дерево. Граф. Поиск в ширину
Реализуйте бинарное дерево поиска. А также методы добавления в него определенного значения, и поворота дерева влево и вправо.

Обойти граф в ширину
граф представить в виде: Списка инцидентности обойти граф: в ширину 1)В вершины графа записать первые 12 букв Вашей фамилии и имени...

Бінарне дерево. Граф. Пошук в ширину
Допоможіть інтернет-крамниці! Крамниція має звязок з соціальною мережею, і коли хотось купує в ній якійсь товар, то ця інформація...

Ориентированный граф + обход в глубину и ширину
1. Задана матрица смежности или инцидентности (по выбору). 2. Построить граф, каждый элемент которого будет представлен в виде: ...

Обойти граф в ширину и прочитать текст в вершинах графа
Рализовать с помощью списка инцедентности граф из 10 вершин(в которых записаны буквы фамилии и часть имени). Обойти граф в ширину и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru