نقاط مفصلی
گرههایی را پیدا میکند که با حذفشان گراف تکه میشود؛ با یک DFS و مقدار low هر گره (کمترین زمان کشفی که از زیردرختش قابل دسترس است).
نقطهی مفصلی (گرهی برشی) گرهای است که با حذفش گراف همبند تکه میشود. امتحان حذف تکتک گرهها O(V·(V + E)) هزینه دارد؛ یک DFS کافی است:
- زمان:
O(V + E) - حافظه:
O(V) - هوروویتز–ساهنی، فصل ۶
- گریمالدی، فصل ۱۲
دو مثلث که با یک پل D — E به هم وصلاند؛ D و E نقطهی مفصلیاند.
def articulation_points(graph, src):disc = {v: 0 for v in graph}low = {v: 0 for v in graph}cut = set()timer = [0]for s in graph:if disc[s] == 0:visit(graph, s, None, disc, low, cut, timer)return cutdef visit(graph, u, parent, disc, low, cut, timer):timer[0] = timer[0] + 1disc[u] = timer[0]low[u] = timer[0]children = 0for v, _ in graph[u]:if disc[v] == 0:children = children + 1visit(graph, v, u, disc, low, cut, timer)low[u] = min(low[u], low[v])if parent is not None:if low[v] >= disc[u]:cut.add(u)elif v != parent:low[u] = min(low[u], disc[v])if parent is None:if children > 1:cut.add(u)
شروع اجرا
- گرهی جاری
(u) - درخت پیمایش (از parent)
- یالِ در حال بررسی
درخت فراخوانیهای بازگشتی
نارنجی پر = فراخوانی در حال اجرا · حاشیهی نارنجی = هنوز روی پشته · خاکستری = تمام شده
متغیرهای محلی
src'A'
نارنجی = در همین گام عوض شد
graph dict
- 'A': [('B', 1), ('D', 1)]
- 'B': [('A', 1), ('D', 1)]
- 'C': [('D', 1)]
- 'D': [('B', 1), ('A', 1), ('E', 1), ('C', 1)]
- 'E': [('D', 1), ('F', 1), ('G', 1)]
- 'F': [('E', 1), ('G', 1)]
- 'G': [('F', 1), ('E', 1)]
Call stack
- articulation_points()خط 1
گام ۱ از ۱۵۰
رشد تعداد عملیات با اندازهی ورودی
میانگین ۵ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.
- check
- ورودی فعلی (n=7)
نمایش به شکل جدول
| n | check |
|---|---|
| 4 | 10.4 |
| 8 | 27.6 |
| 12 | 41.6 |
| 16 | 56 |
| 20 | 70.8 |
| 24 | 74.4 |
| 28 | 94.4 |
توضیح
ایده
نقطهی مفصلی (گرهی برشی) گرهای است که با حذفش گراف همبند تکه میشود. امتحان حذف تکتک گرهها O(V·(V + E)) هزینه دارد؛ یک DFS کافی است:
disc[u]: زمان کشفu.low[u]: کمترین زمان کشفی که از زیردرختu(با یالهای درخت و حداکثر یک یال برگشتی) میشود به آن رسید.
قاعده
- گرهی غیرریشهی
uنقطهی مفصلی است اگر فرزندی مثلvداشته باشد کهlow[v] ≥ disc[u]؛ یعنی زیردرختvبدون عبور ازuبه بالاتر راهی ندارد. - ریشه نقطهی مفصلی است اگر در درخت DFS بیش از یک فرزند داشته باشد.
هزینه
یک DFS: O(V + E).
در trace به چه چیزی نگاه کنی
- عدد کنار هر گره
lowآن است؛ ببین یالهای برگشتی چطور آن را کم میکنند. - مجموعهی
cutدر پنل حافظه نقاط مفصلی پیداشده است.