شجرة جوموري-هو

تصغير|عن اليمين شجرة جوموري-هو وعن الشمال المُخطط |200px
فليكن G=(V,E) مخطط غير موجه، ولنفرض أنَّ |V|=n وكذلك  |E|=m , تواصل الاضلاع بين رأسين s,t\in V  ونرمز لها ب- \lambda (s,t) وهي مُعرف على انه القص (cut) الاصغر الذي يفصل بين s و- t , قص كهذا يُدعى القص ذو الحد الادنى بين s-t , بشكل واضح يمكن حساب \lambda (s,t) في جدول لكل O(n^2) الازواج ولكن نريد وسيلة حساب اسرع وأكثر نجاعة.

اشجار جوموري-هو (والمعروفة أيضا باشجار القص) تعطي وسيلة ناجعة لهذه المسألة وهي ايجاد القص ذو الحد الادنى بين كل الازواج، وهذه الاشجار تستخدم O(n) مساحة ذاكرة ولكل زوج s-t يمكن معرفة قيمة الحد الادنى بوقت ثابت أي (O(1 وقت.

## تعريف
شجرة جوموري-هو T=(V,F) لمخطط غير موجه G=(V,E) هي شجرة ذات اوزان غير موجهة مُعرفة على رؤوس المُخطط بحيث تتحقق الخصائص التالية:
* لكل زوج s,t\in V  , \lambda (s,t) هو وزن الضلع الاخف في المسار الوحيد بين s و- t في T (إذا يوجد أكثر من ضلع الذي هو الاخف حينها أي واحدة منها تفي بالغرض) نرمز لضلع كهذا ب- e(s,t).
* لكل زوج s,t\in V  تقسيم الرؤوس الناتج عن حذف الضلع e(s,t) هو قص ذو حد ادنى بين s-t في المُخطط الاصلي.

مثال: لننظر إلى الصورة كما هو مبين عن اليسار نرى المخطط وكل الاوزان على اضلعه 1 , وعلى اليمين نرى شجرة جوموري-هو الملائمة، مثلا بين الرأسين 2 و- 6 القص ذو الحد الادنى وزنه هو 4 , كما اننا لو ازلنا الضلع (2,6) من الشجرة تنقسم الشجرة لقسمين القسم الأول مركب من الرؤوس 1 و- 2 والباقي في المجموعة الأخرى، هذا التقسيم هو قص ذو حد ادنى في المُخطط الذي في الصورة.

لاحظ انه ليس مفهوم ضمنا ان هناك دوما شجرة تُحقق هذه المواصفات، وما حققه جوموري وهُو في عام 1961 ليس فقط ان هذه الشجرة دوما موجودة انما يمكن حسابها بواسطة حساب n-1 مسائل قص ذو حد ادنى. وفي الواقع لكل مخطط يمكن ان يكون له عدة اشجار جوموري-هو مختلفة.
## خوارزمية

**Gomory–Hu Algorithm**
:*Input*: A weighted undirected graph G = ((*V*G, *E*G), *c*).
: *Output*: A Gomory–Hu Tree *T* = (*V*T, *E*T).
:1. Set *V*T = {*V*G} and *E*T = ∅.
:2. Choose some *X*∈*V*T with | *X* | ≥ 2 if such *X* exists. Otherwise, go to step 6.
:3. For each connected component *C* = (*V*C, *E*C) in *T*∖*X*. Let *S*C = ∪vT∈VC *v*T. Let *S* = { *S*C | *C* is a connected component in *T*∖*X*}.
:&nbsp;&nbsp;&nbsp; Contract the components to form *G* = ((*V*G, *E*G), *c*), where
:: *V*G = *X* ∪ *S*.
:: *E*G = *E*G|X×X ∪ {(*u*, *S*C) ∈ *X*×*S* | (*u*,*v*)∈*E*G for some *v*∈*S*C}.
:: *c* : *V*G×*V*G→*R*+ is the capacity function defined as,
::# if (*u*,*S*C)∈*E*G|X×S, *c*(*u*,*S*C) = Σv∈SC:(u,v)∈EG*c*(*u*,*v*),
::# *c*(*u*,*v*) = *c*(*u*,*v*) otherwise.
:4. Choose two vertices *s*, *t* ∈ *X* and find a minimum *s*-*t* cut (*A*,*B*) in *G*.
:&nbsp;&nbsp;&nbsp; Set *A* = (∪SC∈*A*∩*S* *S*C) ∪ (*A* ∩ *X*) and *B* = (∪SC∈*B*∩*S* *S*C) ∪ (*B* ∩ *X*).
: 5. Set *V*T = (*V*T∖*X*) ∪ {*A* ∩ *X*, *B* ∩ *X*}.
:&nbsp;&nbsp;&nbsp; For each *e* = (*X*, *Y*) ∈ *E*T do
:: If *Y*⊂*A*, set *e* = (*A* ∩ *X*, *Y*), else set *e* = (*B* ∩ *X*, *Y*).
:: Set *E*T = (*E*T∖{*e*}) ∪ {*e*} and *w*(*e*) = *w*(*e*).
:&nbsp;&nbsp;&nbsp; Set *E*T = *E*T ∪ {(*A*∩*X*, *B*∩*X*)}.
:&nbsp;&nbsp;&nbsp; Set *w*((*A*∩*X*, *B*∩*X*)) = *c*(*A*, *B*).
:&nbsp;&nbsp;&nbsp; Go to step 2.
: 6. Replace each {*v*} ∈ *V*T by *v* and each ({*u*},{*v*}) ∈ *E*T by (*u*,*v*). Output *T*.

## مصادر

* المقال بالإنجليزية Gomory–Hu tree , منه اخذت الخوارزمية.
* Ming-Yang Kao , "encyclopedia of algorithms", pg. 164-166

تصنيف:استمثال توافقي
تصنيف:خوارزميات تعتمد على نظرية البيان