जो मैं कह सकता हूं, न केवल ब्रायन की हंच स्पॉट है, बल्कि एक मजबूत प्रस्ताव भी है धारण करता है: प्रत्येक किनारे जो न्यूनतम स्पैनिंग पेड़ में नहीं है, बिल्कुल एक नया "आधार चक्र" जोड़ता है।
इसे देखने के लिए, देखते हैं कि क्या होता है जब आप एक बढ़त ई जोड़ते हैं जो एमएसटी में नहीं है। चलो चीजों को जटिल बनाने और कुछ नोटेशन जोड़ने के लिए पसंदीदा गणित तरीका करते हैं;) मूल ग्राफ जी, ई जी जोड़ने से पहले ग्राफ, और ई जी जोड़ने के बाद ग्राफ को कॉल करें। इसलिए हमें यह जानने की ज़रूरत है कि "बेस चक्र गणना" जी से 'जी' में कैसे बदलती है।
ई जोड़ने से कम से कम एक चक्र बंद होना चाहिए (अन्यथा ई पहली जगह जी के एमएसटी में होगा)। तो जाहिर है कि इसे जी में पहले से मौजूद मौजूदा लोगों को कम से कम एक "आधार चक्र" जोड़ना होगा। लेकिन क्या यह एक से अधिक जोड़ता है?
यह दो से अधिक नहीं जोड़ सकता है, क्योंकि कोई किनारा दो से अधिक आधार चक्रों का सदस्य नहीं हो सकता है। लेकिन यदि ई दो आधार चक्रों का सदस्य है, तो इन दो बेस चक्रों का "संघ" जी में आधार चक्र होना चाहिए, इसलिए फिर हम पाते हैं कि चक्रों की संख्या में परिवर्तन अभी भी एक है।
एर्गो, प्रत्येक किनारे के लिए एमएसटी में नहीं, आपको एक नया आधार चक्र मिलता है। तो "गिनती" हिस्सा सरल है। प्रत्येक आधार चक्र के लिए सभी किनारों ढूँढना है एक छोटे से जटिल काम है, लेकिन ऊपर के तर्क के बाद, मुझे लगता है कि यह यह कर सकता है (छद्म अजगर में):
for v in vertices[G]:
cycles[v] = []
for e in (edges[G] \ mst[G]):
cycle_to_split = intersect(cycles[e.node1], cycles[e.node2])
if cycle_to_split == None:
# we're adding a completely new cycle
path = find_path(e.node1, e.node2, mst[G])
for vertex on path:
cycles[vertex].append(path + [e])
cycles
else:
# we're splitting an existing base cycle
cycle1, cycle2 = split(cycle_to_split, e)
for vertex on cycle_to_split:
cycles[vertex].remove(cycle_to_split)
if vertex on cycle1:
cycles[vertex].append(cycle1)
if vertex on cycle2:
cycles[vertex].append(cycle2)
base_cycles = set(cycles)
संपादित: कोड सभी आधार खोजना चाहिए एक ग्राफ में चक्र (नीचे स्थित बेस_साइकिल)।
- एक ग्राफ (MST [जी]) की न्यूनतम फैले पेड़ खोजने के
- दो सूचियों के बीच अंतर (किनारों \ MST [जी])
- खोजें: मान्यताओं आप जानते हैं कि कैसे करने के लिए कर रहे हैं
यह (विभाजन समारोह) के लिए एक अतिरिक्त बढ़त जोड़कर दो भागों में एक चक्र विभाजित दो सूचियों
के एक चौराहे एक MST
पर दो कोने के बीच पथ खोजने के लिए और यह मुख्य रूप से उपर्युक्त चर्चा का पालन करता है। प्रत्येक किनारे के लिए एमएसटी में नहीं, आपके पास दो मामले हैं: या तो यह एक बिल्कुल नया आधार चक्र लाता है, या यह दो में मौजूदा एक को विभाजित करता है। यह पता लगाने के लिए कि दोनों में से कौन सा मामला है, हम सभी बेस चक्रों को ट्रैक करते हैं कि एक कशेरुक चक्र चक्र का उपयोग करने का एक हिस्सा है।
हाय, Google ड्राइव पर लिंक मर चुका है, यदि आप संभव हो तो अपडेट कर सकते हैं? – kebs