पर ब्रेडथ-पहली खोज के दौरान एज वर्गीकरण मुझे निर्देशित ग्राफ पर चौड़ाई-पहली खोज के दौरान किनारों को उचित रूप से वर्गीकृत करने का कोई तरीका ढूंढने में कठिनाई हो रही है।एक निर्देशित ग्राफ
एक चौड़ाई-पहले या गहराई-पहले खोज के दौरान, आप वर्गीकृत कर सकते हैं किनारों 4 वर्गों के साथ मुलाकात की:
- वृक्ष
- वापस
- आगे क्रॉस
स्कीनिया [1] एक कार्यान्वयन देता है। यदि आप v1 से v2 तक किनारे के साथ आगे बढ़ते हैं, तो संदर्भ में जावा में डीएफएस के दौरान कक्षा को वापस करने का एक तरीका है। माता-पिता का नक्शा वर्तमान खोज के लिए पैरेंट वर्टेक्स देता है, और timeOf()
विधि, जिस समय पर कशेरुक की खोज की गई है।
if (v1.equals(parents.get(v2))) { return EdgeClass.TREE; }
if (discovered.contains(v2) && !processed.contains(v2)) { return EdgeClass.BACK; }
if (processed.contains(v2))
{
if (timeOf(v1) < timeOf(v2))
{
return EdgeClass.FORWARD;
}
else
{
return EdgeClass.CROSS;
}
}
return EdgeClass.UNCLASSIFIED;
मेरे समस्या यह है कि मैं यह सही एक निर्देशित ग्राफ पर एक चौड़ाई पहले खोज के लिए नहीं मिल सकता है। उदाहरण के लिए:
निम्नलिखित ग्राफ - एक पाश है कि - ठीक है: एक से
A -> B
A -> C
B -> C
BFSing, बी की खोज की जाएगी, तो सी किनारों EAB और पूर्वी वायु कमान वृक्ष किनारों हैं, और जब EBC आखिरी पार हो गया है, बी और सी संसाधित और खोजे जाते हैं, और इस किनारे को सही ढंग से क्रॉस के रूप में वर्गीकृत किया जाता है।
लेकिन एक सादे पाश काम नहीं करता:
A -> B
B -> C
C -> A
जब किनारे ईसीए पिछले पार कर जाता है, एक संसाधित और खोज की है। तो इस किनारे को गलत रूप से क्रॉस के रूप में लेबल किया गया है, भले ही यह एक बैक एज हो।
दो मामलों के इलाज के तरीके में वास्तव में कोई अंतर नहीं है, भले ही दोनों किनारों के अलग-अलग वर्ग हों।
आप निर्देशित ग्राफ पर बीएफएस के लिए उचित किनारे वर्गीकरण को कैसे कार्यान्वित करते हैं?
संपादित
यहाँ एक कार्यान्वयन @redtuna जवाब से ली गई। मैंने अभी रूट के माता-पिता को लाने के लिए एक चेक जोड़ा है। मैं JUnits परीक्षण पता चलता है कि यह निर्देशित किया गया और अनिर्दिष्ट रेखांकन के लिए काम करता है, एक पाश, एक सीधी रेखा, एक कांटा, एक मानक उदाहरण के लिए, एक एकल बढ़त, आदि के मामले में .... है
@Override
public EdgeClass edgeClass(final V from, final V to)
{
if (!discovered.contains(to)) { return EdgeClass.TREE; }
int toDepth = depths.get(to);
int fromDepth = depths.get(from);
V b = to;
while (toDepth > 0 && fromDepth < toDepth)
{
b = parents.get(b);
toDepth = depths.get(b);
}
V a = from;
while (fromDepth > 0 && toDepth < fromDepth)
{
a = parents.get(a);
fromDepth = depths.get(a);
}
if (a.equals(b))
{
return EdgeClass.BACK;
}
else
{
return EdgeClass.CROSS;
}
}
मैंने इस समाधान को सफलतापूर्वक कार्यान्वित और परीक्षण किया। यह ग्राफ के निर्देशित/अप्रत्यक्ष-नस्ल की परवाह किए बिना काम करता है। मैंने कुछ मामूली बदलाव किए हैं जो मैं प्रश्न के नीचे पोस्ट करूंगा। धन्यवाद! –