Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ขอบขั้นต่ำที่จำเป็นในการเพิ่มเพื่อสร้างวงจรออยเลอร์ใน C ++


แนวคิด

ในส่วนที่เกี่ยวกับกราฟที่ไม่ระบุทิศทางของโหนด b และขอบ ภารกิจคือการกำหนดขอบขั้นต่ำที่จำเป็นในการสร้างวงจรออยเลอร์ในกราฟที่กำหนด

ป้อนข้อมูล

b = 3,
a = 2
Edges[] = {{1, 2}, {2, 3}}

ผลผลิต

1

ขอบขั้นต่ำที่จำเป็นในการเพิ่มเพื่อสร้างวงจรออยเลอร์ใน C ++

ด้วยการเชื่อมต่อ 1 ถึง 3 เราสามารถสร้างวงจรออยเลอร์ได้

วิธีการ

ในส่วนที่เกี่ยวกับวงจรออยเลอร์ที่มีอยู่ในกราฟ เราต้องการให้ทุกโหนดควรมีระดับที่เท่ากัน เนื่องจากมีขอบที่สามารถนำไปใช้เพื่อออกจากโหนดหลังจากเข้าไปได้

ตอนนี้มีสองกรณี -

การมีอยู่ขององค์ประกอบที่เชื่อมต่อกันในกราฟ

ในกรณีนี้ หากโหนดทั้งหมดในกราฟมีดีกรีคู่ เราก็บอกว่ากราฟมีวงจรออยเลอร์อยู่แล้ว และเราไม่จำเป็นต้องเพิ่มขอบใดๆ เข้าไป แต่ถ้ามีโหนดใดติดตั้งระดับคี่ เราจำเป็นต้องเพิ่มขอบ กราฟยังมีจุดยอดองศาคี่จำนวนคู่ เหตุการณ์นี้สามารถตรวจสอบได้ง่าย ๆ ด้วยข้อเท็จจริงที่ว่าผลรวมขององศาจากโหนดองศาคู่และองศาจากโหนดองศาคี่ควรตรงกับองศารวมที่เสมอแม้ในขณะที่ขอบทุกอันมีส่วนทำให้เกิดผลรวมนี้สอง ด้วยเหตุนี้ หากเราจับคู่โหนดระดับคี่แบบสุ่มในกราฟและเพิ่มขอบระหว่างโหนดเหล่านี้ เราสามารถสร้างโหนดทั้งหมดให้มีดีกรีคู่กันได้ ดังนั้นจึงสร้างวงจรออยเลอร์ได้

การมีอยู่ของส่วนประกอบที่ขาดการเชื่อมต่อในกราฟ

ตอนแรกเราทำเครื่องหมายส่วนประกอบเป็นคี่และคู่ ส่วนประกอบแปลก ๆ คือส่วนประกอบที่มีโหนดระดับคี่ขั้นต่ำหนึ่งโหนด ตอนนี้เรานำองค์ประกอบคู่ทั้งหมดมาและเลือกจุดยอดสุ่มจากทุกองค์ประกอบแล้วจัดเรียงเป็นเส้นตรง ดังนั้น การเพิ่มขอบระหว่างจุดยอดที่อยู่ติดกัน เราจึงเชื่อมต่อองค์ประกอบคู่และสร้างองค์ประกอบคี่ที่เทียบเท่ากันซึ่งมีสองโหนดที่มีดีกรีเป็นคี่

ด้วยเหตุนี้ เพื่อจัดการกับส่วนประกอบที่แปลกประหลาด เช่น ส่วนประกอบที่มีโหนดดีกรีอย่างน้อยหนึ่งโหนด เราสามารถเชื่อมต่อส่วนประกอบแปลก ๆ เหล่านี้ทั้งหมดโดยใช้ขอบที่มีจำนวนเท่ากับจำนวนของส่วนประกอบที่ตัดการเชื่อมต่อ ซึ่งสามารถทำได้โดยการจัดวางส่วนประกอบตามลำดับวงจร และเลือกโหนดระดับคี่สองโหนดจากทุกองค์ประกอบ และใช้สิ่งเหล่านี้เพื่อเชื่อมต่อกับส่วนประกอบที่ด้านใดด้านหนึ่ง ตอนนี้เรามีองค์ประกอบที่เชื่อมต่อเพียงชิ้นเดียวซึ่งเราได้อธิบายไว้

ตัวอย่าง

//This C++ program finds minimum edge required
// to make Euler Circuit
#include <bits/stdc++.h>
using namespace std;
// This Depth-First Search finds a connected
// component
void dfs1(vector<int> g1[], int vis1[], int odd1[],
int deg1[], int comp, int v){
   vis1[v] = 1;
   if (deg1[v]%2 == 1)
      odd1[comp]++;
   for (int u : g1[v])
      if (vis1[u] == 0)
         dfs1(g1, vis1, odd1, deg1, comp, u);
}
// We return minimum edge required to build Euler
// Circuit
int minEdge1(int n, int m, int s1[], int d1[]){
   // g1 : to store adjacency list
   // representation of graph.
   // e1 : to store list of even degree vertices
   // o1 : to store list of odd degree vertices
   vector<int> g1[n+1], e1, o1;
   int deg1[n+1]; // Degrees of vertices used
   int vis1[n+1]; // To store visited in DFS
   int odd1[n+1]; // Number of odd nodes in components
   memset(deg1, 0, sizeof(deg1));
   memset(vis1, 0, sizeof(vis1));
   memset(odd1, 0, sizeof(odd1));
   for (int i = 0; i < m; i++){
      g1[s1[i]].push_back(d1[i]);
      g1[d1[i]].push_back(s1[i]);
      deg1[s1[i]]++;
      deg1[d1[i]]++;
   }
   // This 'ans' is result and 'comp' is component id
   int ans = 0, comp = 0;
   for (int i = 1; i <= n; i++){
      if (vis1[i]==0){
         comp++;
         dfs1(g1, vis1, odd1, deg1, comp, i);
         // We check that if connected component
         // is odd.
         if (odd1[comp] == 0)
            e1.push_back(comp);
         // We check that if connected component
         // is even.
         else
            o1.push_back(comp);
      }
   }
   // It has been seen that if whole graph is a single connected
   // component with even degree.
   if (o1.size() == 0 && e1.size() == 1)
      return 0;
   // It has been seen that if all connected component is even
   if (o1.size() == 0)
      return e1.size();
   //It has been seen that if graph have atleast one even connected
   // component
   if (e1.size() != 0)
      ans += e1.size();
   // For all the odd connected component.
      for (int i : o1)
         ans += odd1[i]/2;
      return ans;
}
// Driven Program
int main(){
   int b = 3, a = 2;
   int source1[] = { 1, 2 };
   int destination1[] = { 2, 3 };
   cout << minEdge1(b, a, source1, destination1) << endl;
   return 0;
}

ผลลัพธ์

1