แนวคิด
ในส่วนที่เกี่ยวกับกราฟที่ไม่ระบุทิศทางของโหนด b และขอบ ภารกิจคือการกำหนดขอบขั้นต่ำที่จำเป็นในการสร้างวงจรออยเลอร์ในกราฟที่กำหนด
ป้อนข้อมูล
b = 3, a = 2 Edges[] = {{1, 2}, {2, 3}}
ผลผลิต
1
ด้วยการเชื่อมต่อ 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