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

अधिकतम i मान ज्ञात करने का C++ प्रोग्राम


मान लीजिए हमारे पास पूर्णांकों का एक क्रमपरिवर्तन 'seq' और पूर्णांक युग्मों की एक सरणी 'pairs' है जिसका आकार m है और जिसमें 0 से n-1 तक के पूर्णांक हैं। अब हम seq पर निम्न ऑपरेशन जितनी बार संभव हो उतनी बार करते हैं ताकि seq[i] = i (0 ≤ i < n) अधिकतम हो।

  • हमें एक पूर्णांक j चुनना है जहाँ 0 ≤ j < m, और फिर seq[pairs[j] का पहला मान] और seq[pairs[j] का दूसरा मान] को स्वैप करना है।

हमें ऑपरेशन को कई बार करने के बाद seq[i] = i के लिए i का अधिकतम मान ज्ञात करना है।

उदाहरण के लिए, यदि इनपुट है n = 4, m = 2, seq = {0, 3, 2, 1}, pairs = {{0, 1}, {2, 3}}, तो आउटपुट 2 होगा।

अधिकतम संभव मान 2 है।

चरण

इसे हल करने के लिए हम निम्न चरणों का पालन करेंगे:

N := 100
आकार N के सरणी tp, vtmp, vis परिभाषित करें
एक फंक्शन dfs() परिभाषित करें जो j, k लेता है:
    tp[j] := k
    j को vtmp[k] के अंत में डालें
    vis[j] में प्रत्येक मान b के लिए:
        यदि tp[b] != 0, तो जारी रखें
        dfs(b, k)
res := 0
i := 0 से n-1 तक:
    यदि seq[i] == i, तो res बढ़ाएँ
i := 0 से m-1 तक:
    a := pairs[i] का पहला मान
    b := pairs[i] का दूसरा मान
    b को vis[a] के अंत में डालें
    a को vis[b] के अंत में डालें
idx := 1
i := 0 से n-1 तक:
    यदि tp[i] == 0, तो:
        dfs(i, idx)
        vtmp[idx] में प्रत्येक तत्व j के लिए:
            यदि tp[seq[j]] == idx और seq[j] != j, तो:
                res बढ़ाएँ
        idx बढ़ाएँ
res प्रिंट करें

उदाहरण

बेहतर समझ के लिए निम्न कार्यान्वयन देखें:

#include <bits/stdc++.h> using namespace std; const int INF = 1e9; #define N 100 int tp[N]; vector<int> vtmp[N], vis[N]; void dfs(int j, int k){    tp[j] = k;    vtmp[k].push_back(j);    for(auto b : vis[j]) {       if(tp[b] != 0)          continue;       dfs(b, k);    } } void solve(int n, int m, int seq[], vector<pair<int, int>> pairs) {    int res = 0;    for(int i = 0; i < n; i++){       if(seq[i] == i)          res++;    }    for(int i = 0; i < m; i++){       int a = pairs[i].first;       int b = pairs[i].second;       vis[a].push_back(b);       vis[b].push_back(a);    }    int idx = 1;    for(int i = 0; i < n; i++) {       if(tp[i] == 0) {          dfs(i, idx);          for(auto j: vtmp[idx]){             if(tp[seq[j]] == idx && seq[j] != j)                res++;          }          idx++;       }    } cout<< res; } int main() { int n = 4, m = 2, seq[] = {0, 3, 2, 1}; vector<pair<int,int>> pairs = {{0, 1}, {2, 3}}; solve(n, m, seq, pairs); return 0; }

इनपुट

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

आउटपुट

2
  1. ग्राफ में सुपर वर्टेक्स खोजने का C++ प्रोग्राम ग्राफ में सुपर वर्टेक्स खोजने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स वाला एक ग्राफ दिया गया है। वर्टेक्स 1 से n तक संख्याबद्ध हैं और edges सरणी में दी गई एज्स से जुड़े हैं। प्रत्येक वर्टेक्स का एक x मान है जो 1 से n के बीच होता है, यह values सरणी में दिया गया है। हमें ग्राफ में सुपर वर्टेक्स खोजने हैं। एक वर्टेक्स i को सुपर वर्टेक्स कहा जाता है

  1. दिए गए ग्राफ में ब्रिज एज की संख्या ज्ञात करने का C++ प्रोग्राम दिए गए ग्राफ में ब्रिज एज की संख्या ज्ञात करने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स और m एज वाला एक अनभारित, निदेश रहित ग्राफ दिया गया है। ग्राफ में एक ब्रिज एज वह एज है जिसे हटाने से ग्राफ असंबद्ध हो जाता है। हमें दिए गए ग्राफ में ऐसी एज की संख्या ज्ञात करनी है। ग्राफ में समानांतर एज या सेल्फ-लूप नहीं हैं। उदाहरण के लिए, यदि इनपुट है n = 5, m = 6, edges = {{1

  1. ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स और m एज वाला एक भारित, निदेश रहित ग्राफ दिया गया है। ग्राफ का स्कोर ग्राफ में सभी एज भारों का योग है। एज भार ऋणात्मक हो सकते हैं, और यदि उन्हें हटा दिया जाए तो ग्राफ का स्कोर बढ़ जाता है। हमें ग्राफ को संबद्ध रखते हुए एज हटाकर ग्राफ के स्कोर को न्यूनतम करना है। हमें घटाए जा सकन