क्या मेरा ग्राफ प्लानर है?


29

आपका कार्य यह निर्धारित करना है कि क्या ग्राफ़ प्लानर है।

एक ग्राफ प्लेनर है अगर इसे विमान में या दूसरे शब्दों में एम्बेड किया जा सकता है अगर इसे बिना किसी क्रॉसिंग किनारों के खींचा जा सकता है।

इनपुट: आपको निम्नलिखित प्रारूपों में अपनी पसंद का अप्रत्यक्ष ग्राफ दिया जाएगा:

  • एज लिस्ट, उदा [(0, 1), (0, 2), (0, 3)]

  • आसन्न नक्शा, उदाहरण के लिए {0: [1, 2, 3], 1:[0], 2:[0], 3:[0]}

  • आसन्न मैट्रिक्स, जैसे [[0, 1, 1, 1], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

नोड नाम संख्या, तार या समान हो सकते हैं, लेकिन आपका चुना हुआ प्रारूप एक मनमाना ग्राफ़ का समर्थन करने में सक्षम होना चाहिए। नोड नामों में कोई कोड नहीं डाल रहा है। कोई आत्म लूप नहीं होगा।

एसटीडीआईएन, कमांड लाइन तर्क और फ़ंक्शन तर्क सहित इनपुट की मानक पसंद।

आउटपुट: आपको सभी प्लानर ग्राफ़ के लिए एक विशिष्ट आउटपुट, और सभी नॉनप्लेनर ग्राफ़ के लिए एक अलग विशिष्ट आउटपुट वापस करना चाहिए।

आउटपुट का मानक विकल्प, जिसमें STDOUT, फ़ंक्शन रिटर्न वैल्यू शामिल है।

उदाहरण:

Planar:

[]
[(0,1), (0,2), (0,3), (0,4), (0,5), (0,6)]
[(0,1), (0,2), (0,3), (1,2), (1,3), (2,3)]
[(0,2), (0,3), (0,4), (0,5), (1,2), (1,3), (1,4), (1,5), (2,3),
 (2,5), (3,4), (4,5)]

nonplanar:

[(0,1), (0,2), (0,3), (0,4), (1,2), (1,3), (1,4), (2,3), (2,4), (3,4)]
[(0,3), (0,4), (0,5), (1,3), (1,4), (1,5), (2,3), (2,4), (2,5)]
[(0,3), (0,4), (0,6), (1,3), (1,4), (1,5), (2,3), (2,4), (2,5), (5,6), 
 (7,8), (8,9), (7,9)]

कोई भी फ़ंक्शन जो स्पष्ट रूप से प्लैनरिटी परीक्षण करता है या अन्यथा विशेष रूप से प्लानर एंबेडिंग को संदर्भित करता है।

यह कोड गोल्फ है। सबसे छोटी कोड जीत हो सकती है।


अच्छा प्रश्न !

यह महान है कि यह एक क्लासिक समस्या है और अभी भी कई संभावित दृष्टिकोण हैं, जिनमें सामान्य प्रयोजनों के लिए कोड में उपयोग नहीं किए गए हैं।
1911 में lirtosiast

गैर-कनेक्टेड ग्राफ के लिए एक प्लेनर और एक गैर-प्लानर कनेक्टेड घटक के लिए एक परीक्षण मामला अच्छा होगा।
पीटर टेलर

@PeterTaylor ज़रूर, मैं एक जोड़ दूंगा।
isaacg

5
@RenaeLider क्षमा करें, लेकिन मुझे समझ नहीं आया। प्रश्न का फ़्लोटिंग पॉइंट नंबरों से कोई लेना देना नहीं है - यह संख्याओं का उपयोग भी नहीं करता है, वास्तव में, बस लेबल।
इसहाक

जवाबों:


14

गणितज्ञ, 201 बाइट्स

f@g_:=EdgeCount@g<9||!(h=g~IsomorphicGraphQ~CompleteGraph@#&)@5&&!h@{3,3}&&And@@(f@EdgeDelete[g,#]&&f@EdgeContract[g,#]&/@EdgeList@g);And@@(f@Subgraph[g,#]&/@ConnectedComponents[g=Graph[#<->#2&@@@#]])&

यह एक अनाम फ़ंक्शन का मूल्यांकन करता है, जो एक बढ़त सूची की तरह लेता है

{{0, 3}, {0, 4}, {0, 5}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}}

यह वैगनर के प्रमेय के आधार पर एक बहुत ही अकुशल पुनरावर्ती दृष्टिकोण है :

एक परिमित ग्राफ प्लानर है यदि और केवल यदि उसके पास K 5 या K 3,3 नाबालिग के रूप में नहीं है।

यहाँ, K 5 पूर्ण 5 ग्राफ के साथ ग्राफ है, और K 3,3 प्रत्येक समूह में 3 कोने के साथ पूर्ण द्विपद ग्राफ है। एक ग्राफ A ग्राफ B का एक छोटा है अगर इसे किनारे से हटाए जाने और किनारे के संकुचन के अनुक्रम से B से प्राप्त किया जा सकता है ।

तो यह कोड सिर्फ जांच करता है कि ग्राफ के लिए है isomorphic कश्मीर 5 या कश्मीर 3,3 और यदि नहीं तो यह रिकर्सिवली ही हर संभव बढ़त विलोपन या संकुचन के लिए एक बार कहता है।

पकड़ यह है कि एक असंबद्ध ग्राफ के एक घटक में किनारों को हटाने या अनुबंधित करने से वहां सभी खामियों से छुटकारा नहीं मिलेगा, इसलिए हम कभी भी वांछित समरूपता नहीं पाएंगे। इसलिए, हम इस खोज को इनपुट ग्राफ के प्रत्येक जुड़े घटक के लिए अलग से लागू करते हैं।

यह दिए गए इनपुट के लिए बहुत तेजी से काम करता है, लेकिन यदि आप कुछ और किनारों को जोड़ते हैं तो यह जल्दी से भयावह रूप से लंबा हो जाएगा (और साथ ही बहुत सारी मेमोरी भी लेगा)।

यहाँ एक इंडेंटेड संस्करण है f(अनाम फ़ंक्शन इसके बाद सिर्फ इनपुट से एक ग्राफ़ ऑब्जेक्ट उत्पन्न करता है:

f@g_ := 
  EdgeCount@g < 9 || 
  ! (h = g~IsomorphicGraphQ~CompleteGraph@# &)@5 && 
  ! h@{3, 3} &&
  And @@ (f@EdgeDelete[g, #] && f@EdgeContract[g, #] & /@ EdgeList@g)

और यह अनाम फ़ंक्शन है जो इनपुट को ग्राफ़ में परिवर्तित करता है और fप्रत्येक जुड़े घटक के लिए कॉल करता है:

And @@ (
  f @ Subgraph[g, #] & /@ ConnectedComponents[
    g=Graph[# <-> #2 & @@@ #]
  ]
)&

मैं से समाप्ति हालत बदलकर बाइट्स के एक जोड़े को बचा सकता है EdgeCount@g<9करने के लिए g==Graph@{}है, लेकिन यह काफी क्रम को उड़ाने होगा। दूसरे परीक्षण के मामले में 30 सेकंड लगते हैं, और अंतिम एक अभी तक पूरा नहीं हुआ है।


आप नामांकित फ़ंक्शन का उपयोग #0करने का प्रयास कर सकते हैं और हटा सकते हैं जो अंतरतम शुद्ध फ़ंक्शन को संदर्भित करता है।
लेजिओनमाला 978

@ LegionMammal978 मुझे पता है, लेकिन यह वास्तव में कुछ भी नहीं बचाता है, क्योंकि तब मुझे कोष्ठक की आवश्यकता होती है और मैन्युअल रूप #से एक चर को असाइन करने की भी आवश्यकता होती है g
मार्टिन एंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.