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

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

29.04.2014, 20:57. Показов 6597. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru