डीएजी की सकर्मक कमी


13

मैं OAG (V + E) एल्गोरिथ्म की तलाश में हूं, जो कि एक डीएजी द्वारा दी गई सकर्मक कमी को खोजने के लिए है ।

यह संभव के रूप में कई किनारों को हटा दिया जाता है ताकि यदि आप यू से वी तक पहुंच सकें, तो मनमाना वी और यू के लिए, आप किनारों को हटाने के बाद भी पहुंच सकते हैं।

यदि यह एक मानक समस्या है, तो कृपया मुझे कुछ मॉडल समाधान की ओर संकेत करें।


आप अपने द्वारा दिए गए विकिपीडिया लेम्मा में दिए गए संदर्भ का उपयोग नहीं कर सकते हैं?
हेंड्रिक जनवरी

2
अच्छी तरह से, एल्गोरिथ्म विकिपीडिया में बजाय बजाय सबसे अच्छे मामले में (सबसे अच्छा मामले में, अर्थात, एसाइकल ग्राफ के मामले में पर चर्चा करता है । मुझे लगता है कि यहाँ सही उत्तर यह है कि जिस एल्गोरिथ्म को आप वर्तमान में देख रहे हैं वह मौजूद नहीं हो सकता हैO(V×E)O(V+E)
कार्लोस लिनारेस लोपेज़

1
सहमत हैं कि यह स्पष्ट नहीं है कि आप जो मांग रहे हैं वह मौजूद है। ऐसे बहुत सारे कागजात हैं जो इस तरह के एक एल्गोरिथ्म होने पर निर्बाध होंगे , उदाहरण के लिए, scirectirect.com/science/article/pii/0012365X9390164O । उस ने कहा, यदि आप अपनी प्रेरणा के बारे में अधिक विशिष्ट हो सकते हैं, तो अधिक विशिष्ट समाधान हो सकते हैं। उदाहरण के लिए, क्या आप ग्राफ़ के बारे में कुछ और जानते हैं या काम करेंगे? O(n(n+m))
विलियम मैक्रे

मैंने समस्या को कहीं देखा, लेकिन कोई अतिरिक्त जानकारी नहीं थी, शायद समस्या में एक टाइपो था।
करण

1
क्या होगा यदि आप अपने DAG में संस्थानिक तरह करते हैं, लेकिन बच्चों का उपयोग करके पहुंचा जा सकता कोने का ट्रैक रखने, यानी , तो नवीनतम आइटम से क्रमबद्ध ग्राफ में शुरू करते हैं, और अप्रयुक्त किनारों को हटा दें और पहुंच योग्य फ़ंक्शन को संरक्षित करके ऊपर जाएं, इससे आपको अधिकतम संभव किनारों को हटाने की सुविधा मिलती है, लेकिन मुझे यकीन नहीं है कि यह अधिकतम संभावना प्राप्त करता है (यह ।reachable[v]=vchildrenvreachable[v]O(|E|+|V|)

जवाबों:


8

हम प्रत्येक शीर्ष से केवल DFS कर इस समस्या को हल कर सकते हैं।

  1. प्रत्येक शीर्ष के लिए , प्रत्येक से VFS शुरू करें, जैसे कि , का प्रत्यक्ष वंशज है । एक बढ़त है।uGvvu(u,v)
  2. प्रत्येक शिखर के लिए से डीएफएस तक पहुंचा जा सकता , धार हटाने ।vv(u,v)

ऊपर की समग्र जटिलता डीएफएस ' को चलाने की जटिलता है , जो ।NO(N(N+M))


1
ध्यान दें कि, asymptotically, इस प्रश्न में स्वयं से जुड़े विकिपीडिया लेख में एल्गोरिथ्म के रूप में एक ही जटिलता है। O(NM)
डेविड रिचेर्बी

1
माना। चूंकि इस सवाल के लिए एक संक्षिप्त जवाब था, मैंने एक प्रस्तुत किया है। इसके अलावा, एक समाधान IMO है, संभावना नहीं है। O(N)
प्रतीक्षारत

3

वह नहीं जिसकी आप तलाश कर रहे हैं। लेकिन सिर्फ ज्ञान बांटने के उद्देश्य से, आप ऐसा कर सकते हैं कि संदेशों के साथ यदि आप मानते हैं कि प्रत्येक शीर्ष प्रोसेसर के रूप में कार्य करता है । ध्यान दें कि प्रत्येक शीर्ष पर एक तुलनीय मूल्य है। इसलिए, कुछ लंबवत मौजूद हैं जैसे कि वे अपने सभी पड़ोसियों से बड़े हैं। ये कोने निम्नलिखित करते हैं:O(|E|)

  1. चलो की अधिकतम छोटे पड़ोसी होना ,वीuv
  2. को संदेश भेजें और आउटपुट में बढ़त करें।( वी , यू )u(v,u)
  3. हर पड़ोसी के लिए के और (और दोनों की तुलना में छोटे), शामिल नहीं हैं उत्पादन में।u v ( v , w )wuv(v,w)
  4. सभी किनारे तक चरणों को दोहराएं एक छोटे पड़ोसी के लिए शिखर की या तो शामिल किया गया है या उत्पादन में शामिल नहीं।वी ' वी(v,v)vv

अब यदि किसी नोड को प्रत्येक बड़े पड़ोसी से संदेश प्राप्त होता है (अर्थात सभी किनारों को शामिल किया जाता है या शामिल नहीं किया जाता है, तो नोड कार्य करता है जैसे कि यह उसके पड़ोस में सबसे बड़ा था। अर्थात, यह प्रदर्शन करता है। पहले 4 चरणों का उल्लेख किया।( v , v ) वीv(v,v)v

यह एल्गोरिथ्म वितरित वातावरण में संदेशों को समाप्त करता है। मुझे पता है कि यह वह नहीं है जो आप पूछ रहे हैं।O(|E|)


1

Lemma: यदि कोई किनारा है V -> Y और Y भी V का अप्रत्यक्ष उत्तराधिकारी है, (जैसे, V -> W -> + Y) तो धार V -> Y सकर्मक है और संक्रामक मूल का हिस्सा नहीं है।

विधि: टर्मिनल से प्रारंभिक कोने तक रिवर्स टॉपोलॉजिकल ऑर्डर में काम करते हुए, प्रत्येक शीर्ष के सकर्मक समापन का ट्रैक रखें। V के अप्रत्यक्ष उत्तराधिकारियों का समूह V के तात्कालिक उत्तराधिकारियों के सकर्मक बंदों का मिलन है। V का सकर्मक समापन इसके अप्रत्यक्ष उत्तराधिकारियों और इसके तत्काल उत्तराधिकारियों का मिलन है।

कलन विधि:

    Initialise Visited as the empty set.
    For each vertex V of G, 
        Invoke Visit(V).

    Visit(V):
        If V is not in Visited,
            Add V to Visited, 
            Initialise Indirect as the empty set,
            For each edge V -> W in G,
                Invoke Visit(W),
                Add Closure(W) to Indirect.
            Set Closure(V) to Indirect.
            For each edge V -> W in G,
                Add W to Closure(V),
                If W is in the set Indirect,
                    Delete the edge V -> W from G.

यह मानता है कि आपके पास कोने के सेट (जैसे, बिट मैप्स) का ट्रैक रखने का कुछ कुशल तरीका है, लेकिन मुझे लगता है कि यह धारणा अन्य (वी + ई) एल्गोरिदम में भी बनाई गई है।

संभावित रूप से उपयोगी साइड-इफेक्ट यह है कि यह जी के प्रत्येक शीर्ष के सकर्मक बंद को पाता है।


मैंने आपके पहले वाले खाते पर पोस्ट किया गया उत्तर हटा दिया है। यदि आप अभी भी अपने दो खातों को मर्ज करना चाहते हैं, तो कृपया सहायता केंद्र के चरणों का पालन करें । यह कहा जा रहा है, क्योंकि पहले के खाते में अब कोई दृश्य सामग्री नहीं है, आप बस नए से चिपके रह सकते हैं।
गाइल्स का SO- बुराई पर रोक illes

0

मैंने उसी समस्या को हल किया, लेकिन यह बिल्कुल वैसा ही नहीं था। इसने कमी के बाद ग्राफ में किनारों की न्यूनतम संख्या के लिए पूछा कि मूल रूप से जुड़े कोने अभी भी जुड़े हुए हैं और कोई नया कनेक्शन नहीं बना है। जैसा कि स्पष्ट है, यह कम किए गए ग्राफ को खोजने के लिए नहीं कहता है लेकिन कितने निरर्थक किनारे मौजूद हैं। इस समस्या को O (V + E) में हल किया जा सकता है। स्पष्टीकरण का लिंक https://codeforces.com/blog/entry/56326 है । लेकिन मुझे लगता है कि ग्राफ को वास्तव में बनाना है, इसमें ओ (एन) की तुलना में उच्च जटिलता होगी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.