LINUX.ORG.RU

построение двусвязного графа

 ,


0

1

пример посмотрел, компилить - компилится. что дальше делать - не пойму. нужно достроить граф, чтобы обеспечить двусвязность.

Found 4 biconnected components.
Found 3 articulation points.
graph A {
node[shape=«circle»]
B [ style=«filled», fillcolor=«red» ];
G [ style=«filled», fillcolor=«red» ];
A [ style=«filled», fillcolor=«red» ];
A — F[label=«1»]
A — B[label=«1»]
A — G[label=«3»]
B — C[label=«0»]
B — D[label=«0»]
B — E[label=«1»]
C — D[label=«0»]
E — F[label-«1»]
G — I[label=«2»]
G — H[label=«2»]
H — I[label=«2»]
}
Press <RETURN> to close this window...

как можно использовать эту информацию? понятно, что эти articulations points нужно с чем-нибудь соединить, но как, чтобы по-хорошему всё было? покороче и покрасивше. у меня граф взвешенный, кстати, в отличие от примера .



Последнее исправление: vladimirsmirnov9 (всего исправлений: 2)

понятно, что эти articulations points нужно с чем-нибудь соединить, но как, чтобы по-хорошему всё было?

Ты, наверное, не понял, что такое точка сочленения. Если ты ее удалишь, граф становится несвязным. Толку ее с чем-то соединять, если ребро пропадет вместе с вершиной?

как, чтобы по-хорошему всё было?

Есть такая мысль. Удалим все точки сочленения и обойдем граф, чтобы осознать, что у нас K компонент связности. Собственно, тебе надо провести K-1 ребро (читай, построить любое дерево в сконденсированном графе двусвязных компонент).

metar ★★★
()

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

dikiy ★★☆☆☆
()
Ответ на: комментарий от metar

построить любое дерево в сконденсированном графе двусвязных компонент

любое не пойдёт, нужно достроить с минимальным возможным весом по длине

vladimirsmirnov9
() автор топика
Ответ на: комментарий от dikiy

ну а в двух словах - ищешь путь, проходящий через все двухсвязные компоненты. Потом берешь крайние компоненты и лепишь между ними ребро.

dikiy ★★☆☆☆
()
Ответ на: комментарий от vladimirsmirnov9

любое не пойдёт, нужно достроить с минимальным возможным весом по длине

ну значит берешь BFS. и добавляешь ребра так, чтобы остались одни кольца.

dikiy ★★☆☆☆
()
Ответ на: комментарий от vladimirsmirnov9

неужели в бусте этого нет?

BFS? есть конечно. Но тебе же сказали, что для начала надо заменить двухсвязные компоненты вершинами (сконденсировать).

dikiy ★★☆☆☆
()
Ответ на: комментарий от vladimirsmirnov9

любое не пойдёт, нужно достроить с минимальным возможным весом по длине

Ну и ладно, находжение минимального остовного дерева - это тоже классический алгоритм.

Итого в моем понимании задача решается в такие этапы:
1) Нашли точки сочленения (модифицированный обход в глубину)
2) Рассматриваем граф без них
3) Сжимаем каждую связную компоненту в вершину (серия обычный обходов графа - можно полениться и использовать уже написанный модифицированный без потери в асимптотике)
4) Находим минимальное остовное дерево (алгоритм Прима, Краскала или Борувки)
5) Восстанавливаем по пунктам 2-4, что надо было сделать с исходным графом

metar ★★★
()
Ответ на: комментарий от anonymous

я про готовый алгоритм :)

Вы, случайно, не с дельфи перешли?

в квотезы!

dikiy ★★☆☆☆
()
Ответ на: комментарий от metar

но что делать, если в графе существуют «островки» вершин, не связанные с основным графом? теперь получается так, что при вызове алгоритма при отсутствии точек артикуляции, ничего не происходит; когда же такие точки присутствуют, эти островки становятся соединёнными с основным графом. можно, конечно, отказаться от варианта достраивания уже существующего графа для обеспечения двусвязности и строить минимальный двусвязный граф, но уж очень хочется, чтобы такая возможность существовала.

vladimirsmirnov9
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.