Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C/C++ में 2-सैटिस्फायबिलिटी (2-SAT) समस्या


मान लें f = (x1 ∨ y1) ∧ (x2 ∨ y2) ∧ ... ∧ (xn ∨ yn)।

समस्या: क्या f संतुष्टिदायक है?

xi ∨ yi और C/C++ में 2-सैटिस्फायबिलिटी (2-SAT) समस्या और C/C++ में 2-सैटिस्फायबिलिटी (2-SAT) समस्या सभी समतुल्य हैं। इसलिए हम प्रत्येक (xi ∨ yi) को उन दो कथनों में परिवर्तित कर रहे हैं।

अब 2n वर्टेक्स वाले एक ग्राफ मान लें। प्रत्येक (xi ∨ yi) के लिए दो निर्देशित किनारे जोड़े जाते हैं

  • ¬xi से yi तक

  • ¬yi से xi तक

यदि दोनों ¬xi और xi एक ही SCC (स्ट्रॉन्गली कनेक्टेड कंपोनेंट) में हैं तो f को संतुष्टिदायक नहीं माना जाता है।

मान लें कि f संतुष्टिदायक है। अब हम f को संतुष्ट करने के लिए प्रत्येक वेरिएबल को मान देना चाहते हैं। यह हमारे द्वारा निर्मित ग्राफ के वर्टेक्स के टोपोलॉजिकल सॉर्ट के साथ किया जा सकता है। यदि टोपोलॉजिकल सॉर्ट में ¬xi, xi के बाद है, तो xi को FALSE माना जाना चाहिए। अन्यथा इसे TRUE माना जाना चाहिए।

स्यूडो कोड

func dfsFirst1(vertex v1):    marked1[v1] = true    for each vertex u1 adjacent to v1 do:       if not marked1[u1]:             dfsFirst1(u1)       stack.push(v1)    func dfsSecond1(vertex v1):       marked1[v1] = true       for each vertex u1 adjacent to v1 do:          if not marked1[u1]:             dfsSecond1(u1)    component1[v1] = counter for i = 1 to n1 do:       addEdge1(not x[i], y[i])       addEdge1(not y[i], x[i]) for i = 1 to n1 do:    if not marked1[x[i]]:       dfsFirst1(x[i])    if not marked1[y[i]]:       dfsFirst1(y[i])    if not marked1[not x[i]]:       dfsFirst1(not x[i])    if not marked1[not y[i]]:       dfsFirst1(not y[i]) set all marked values false counter = 0 flip directions of edges // change v1 -> u1 to u1 -> v1 while stack is not empty do:    v1 = stack.pop    if not marked1[v1]       counter = counter + 1       dfsSecond1(v1) for i = 1 to n1 do:    if component1[x[i]] == component1[not x[i]]:       it is unsatisfiable       exit    if component1[y[i]] == component1[not y[i]]:       it is unsatisfiable       exit it is satisfiable exit

  1. - C++ में फ्रेंड्स पेयरिंग समस्या

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

  1. - C++ में शेल्फ फिटिंग समस्या

    इस समस्या में, हमें तीन पूर्णांक मान W, n, m दिए गए हैं जो दीवार की लंबाई W, शेल्फ के आकार n, और m को दर्शाते हैं। हमारा कार्य शेल्फ फिटिंग समस्या को हल करने के लिए एक प्रोग्राम बनाना है। हमें शेल्फ को इस तरह फिट करने का तरीका ढूंढना है कि शेल्फ फिट करने के बाद बची हुई जगह न्यूनतम हो। हल करते समय एक

  1. C/C++ में बर्कले का एल्गोरिथ्म C/C++ में बर्कले का एल्गोरिथ्म

    बर्कले का एल्गोरिथ्म वितरित प्रणालियों में क्लॉक सिंक्रोनाइज़ेशन के लिए उपयोग किया जाने वाला एक एल्गोरिथ्म है। यह एल्गोरिथ्म उन मामलों में उपयोग किया जाता है जब वितरित नेटवर्क के कुछ या सभी सिस्टम में निम्नलिखित समस्याएं होती हैं: A. मशीन के पास सटीक समय स्रोत नहीं है। B. नेटवर्क या मशीन के पास UTC