2012-02-06 4 views
2

неориентированный граф из представлен в виде пары узлов:Структура данных, чтобы найти компоненты в неориентированных графов в Python

ребер = (А, В), (В, С), (D, Е), (F, E), (G, E), (G, I), (H, G)

Какой должна быть оптимальной структуры данных в Python, чтобы найти компоненты

подъязыка графа дан (например,

(D, E)). Я имею в виду использование глубинного первого поиска в качестве алгоритма поиска.

+1

Вы используете библиотеку, такую ​​как networkx? Или просто питон? – Lostsoul

ответ

4

Вы проверили библиотеку networkx? Если вы не начинаете с нуля, он обеспечивает отличную структуру данных примитивов для графиков всех форм и размеров.

Входит в комплект Graph.subgraph, который вы можете прочитать на here.

Из документов:

>>> G = nx.Graph() # or DiGraph, MultiGraph, MultiDiGraph, etc 
>>> G.add_path([0,1,2,3]) 
>>> H = G.subgraph([0,1,2]) 
>>> H.edges() 
[(0, 1), (1, 2)] 
0

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

Узел Структура:

{ "имя": "что-то", "соединения": [список подключенных узлов]}

некоторые узлы из ваших данных:

e = {"name": "E"} 
d = {"name": "D"} 
f = {"name": "F"} 
g = {"name": "G"} 

e["connections"] = [d,f,g] 
#... etc with whatever code you want to build the graph itself 

Затем используйте любой алгоритм, который вы хотите. Если вы хотите знать алгоритм, отрегулируйте свой вопрос. Как упоминалось в нем, используйте библиотеку графов, если сможете. Это хорошо протекая территория.

+0

То, что я действительно хочу, это найти связность для конкретного подграфа, заданного начальным узлом. Набор пар узлов: ребра = (A, B), (B, C), (D, E), (F, E), (G, E), (G, I), (H, G) действительно представляют собой два отдельных дерева. Я бы хотел использовать рекурсивный dfs для поиска подключенных компонентов. Я пробовал использовать словари формы: {'A': ['B'] ..}, но они представляют собой ориентированные графы, у меня есть ребра без направления. – user1191510

+0

То, что я действительно хочу, это найти связность для конкретного подграфа, заданного начальным узлом. Набор пар узлов: ребра = (A, B), (B, C), (D, E), (F, E), (G, E), (G, I), (H, G) действительно представляют собой два отдельных дерева. Я бы хотел использовать рекурсивный dfs для поиска подключенных компонентов. Я пробовал использовать словари формы: {'A': ['B'] ..}, но они представляют собой ориентированные графы, у меня есть ребра без направления. Я бы хотел избежать использования конкретных библиотек для графиков. – user1191510

+0

Вам нужен алгоритм или просто структура данных? Извините, я все еще не понимаю. Что касается структуры, которую я представил, если я не понял что-то, нет никакой практической разницы между графиком, где каждое ребро неориентировано, а каждое ребро представляет собой пару направленных ребер. – KobeJohn

Смежные вопросы