یکریختی گراف (پسگرد)
دنبال نگاشتی از رأسهای یک گراف به دیگری میگردد که همهی یالها و نایالها را حفظ کند: رأس به رأس، با پسگرد و هرس با درجهها. در بدترین حالت n! حالت.
دو گراف A و B یکریختاند اگر نگاشت یکبهیکی f از رأسهای A به رأسهای B باشد که u و v در A مجاور باشند اگر و تنها اگر f(u) و f(v) در B مجاور باشند؛ یعنی همان گراف با برچسبهای دیگر.
- زمان:
O(n! · n) in the worst case - حافظه:
O(n) - جانسونباو، فصل ۸
- گریمالدی، فصل ۱۱
دو دور پنجرأسی با شمارهگذاری متفاوت (۰-۱-۲-۳-۴ و ۰-۲-۴-۱-۳)؛ یکریختاند.
def isomorphic(A, B):# A and B are adjacency matrices (1 = edge). Look for f: vertices of A -> vertices of B keeping every edge and non-edge.n = len(A)if len(B) != n:return Nonedeg_a = []deg_b = []for i in range(n):deg_a.append(sum(A[i]))deg_b.append(sum(B[i]))if sorted(deg_a) != sorted(deg_b):return Nonef = [-1] * nused = [False] * nrows = [[i, "·"] for i in range(n)] # for the picture: vertex of A, its image in Bif extend(0, A, B, f, used, deg_a, deg_b, rows):return freturn Nonedef extend(i, A, B, f, used, deg_a, deg_b, rows):n = len(A)if i == n:return Truefor j in range(n):if used[j] or deg_a[i] != deg_b[j]:continueok = Truefor k in range(i):if A[i][k] != B[j][f[k]]:ok = Falsebreakif not ok:continuef[i] = jused[j] = Truerows[i][1] = jif extend(i + 1, A, B, f, used, deg_a, deg_b, rows):return Truef[i] = -1used[j] = Falserows[i][1] = "·"return False
شروع اجرا
جدول هنوز خالی است.
درخت فراخوانیهای بازگشتی
نارنجی پر = فراخوانی در حال اجرا · حاشیهی نارنجی = هنوز روی پشته · خاکستری = تمام شده
متغیرهای محلی
نارنجی = در همین گام عوض شد
A list
B list
Call stack
- isomorphic()خط 1
توضیح
مسئله
دو گراف A و B یکریختاند اگر نگاشت یکبهیکی f از رأسهای A به رأسهای B باشد که u و v در A مجاور باشند اگر و تنها اگر f(u) و f(v) در B مجاور باشند؛ یعنی همان گراف با برچسبهای دیگر.
پسگرد
رأسهای A را به ترتیب نگاشت میکنیم. برای رأس i هر رأس استفادهنشدهی B با همان درجه را امتحان میکنیم و بررسی میکنیم با همهی رأسهای قبلی سازگار باشد (یال در A ⇔ یال در B). اگر به بنبست رسیدیم، انتخاب را پس میگیریم و بعدی را امتحان میکنیم.
هرس و ناورداها
پیش از جستوجو، ناورداها (چیزهایی که یکریختی حفظشان میکند) را مقایسه میکنیم: تعداد رأسها و فهرست درجهها. فرق در یک ناوردا یعنی قطعاً یکریخت نیستند؛ ولی یکی بودن همهی آنها کافی نیست (پیشتنظیم «درجههای یکسان»).
پیچیدگی
در بدترین حالت n! نگاشت. الگوریتم چندجملهای شناختهشدهای نیست، ولی NP-کامل بودنش هم ثابت نشده است (Babai: زمان شبهچندجملهای).
ورودی
A و B ماتریسهای مجاورتاند (۱ یعنی یال)؛ رأسها از ۰ شمارهگذاری شدهاند.