AlgoVerse

بستار تراگذری (وارشال)

برای هر جفت گره تعیین می‌کند آیا از اولی به دومی راهی هست؛ مثل فلوید–وارشال ولی با «یا» و «و» به جای کمینه و جمع.

بستار تراگذری یک رابطه (یا گراف جهت‌دار) می‌گوید از هر گره به کدام گره‌ها راهی هست. وارشال همان ایده‌ی فلوید–وارشال را با مقدارهای درست/نادرست به کار می‌برد:

ادامه‌ی توضیح ↓
ورودی:
V=5 · E=5 · src=Aخروجی PDF

پنج گره؛ از A به همه می‌شود رسید، ولی از E به هیچ‌جا جز خودش نمی‌شود.

  1. def warshall(graph, src):
  2. reach = {u: {v: False for v in graph} for u in graph}
  3. for u in graph:
  4. reach[u][u] = True
  5. for v, _ in graph[u]:
  6. reach[u][v] = True
  7. from_src = reach[src]
  8. for k in graph:
  9. row_k = reach[k]
  10. for i in graph:
  11. if not reach[i][k]:
  12. continue
  13. for j in graph:
  14. if reach[i][j]:
  15. continue
  16. if row_k[j]:
  17. reach[i][j] = True
  18. return reach

ناوردا: بعد از دور k، reach[i][j] درست است اگر و فقط اگر مسیری از i به j باشد که ایستگاه‌های میانی‌اش فقط از گره‌های تا k باشند.

شروع اجرا

ABCDE
  • گره‌ی جاری (k)
  • درخت کوتاه‌ترین مسیر تا اینجا
  • یالِ در حال بررسی

متغیرهای محلی

src'A'

نارنجی = در همین گام عوض شد

graph dict
  • 'A': [('B', 1)]
  • 'B': [('C', 1)]
  • 'C': [('A', 1), ('D', 1)]
  • 'D': [('E', 1)]
  • 'E': []

Call stack

  1. warshall()خط 1
گام ۱ از ۳۸۴
خط سیاه = via · خط نارنجی = گام کلیدیinit: 0/1 · via: 0/5 · check: 0/85 · new_path: 0/8

    رشد تعداد عملیات با اندازه‌ی ورودی

    میانگین ۵ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.

    • check
    • ورودی فعلی (n=5)
    02004006004812n = تعداد گره‌هاcheck
    نمایش به شکل جدول
    ncheck
    439.2
    8244.8
    12583.2
    توضیح

    ایده

    بستار تراگذری یک رابطه (یا گراف جهت‌دار) می‌گوید از هر گره به کدام گره‌ها راهی هست. وارشال همان ایده‌ی فلوید–وارشال را با مقدارهای درست/نادرست به کار می‌برد:

    reach[i][j] = reach[i][j] or (reach[i][k] and reach[k][j])
    

    در دور k، گره‌ی k اجازه دارد ایستگاه میانی باشد.

    کاربرد

    • در ریاضیات گسسته: بستار تراگذری یک رابطه روی مجموعه (ماتریس رابطه).
    • در برنامه‌ها: وابستگی‌ها («چه چیزهایی باید قبل از این ساخته شوند؟»).

    هزینه

    سه حلقه‌ی تودرتو: O(V³). اگر گراف پراکنده باشد، اجرای BFS از هر گره (O(V·(V+E))) سریع‌تر است.

    در trace به چه چیزی نگاه کنی

    • برچسب کنار هر گره نشان می‌دهد آیا گره‌ی اول به آن می‌رسد؛ کل ماتریس reach در پنل حافظه است.