ในปัญหานี้ เราได้รับอาร์เรย์ arr ของตัวเลข N โดยที่ arr[i] แทนโหนด (i+1)th นอกจากนี้ยังมีขอบคู่ M โดยที่ u และ v เป็นตัวแทนของโหนดที่เชื่อมต่อโดยขอบ งานของเราคือสร้างโปรแกรมเพื่อค้นหาผลรวมขององค์ประกอบขั้นต่ำในองค์ประกอบที่เชื่อมต่อทั้งหมดของกราฟที่ไม่มีทิศทาง หากโหนดไม่มีการเชื่อมต่อกับโหนดอื่น ให้นับเป็นส่วนประกอบที่มีโหนดเดียว
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล
arr[] = {2, 7, 5, 1, 2} m = 2
1 2
4 5 ผลผลิต
8
คำอธิบาย
ด้านล่างเป็นกราฟที่แสดงด้านบน -

เรามีโหนดที่เชื่อมต่ออยู่สองโหนดและโหนดเดียว
ดังนั้น มาดูส่วนประกอบที่เชื่อมต่อขั้นต่ำกัน
ต่ำสุด (node1 และ node2) =นาที (2, 7) =2
ต่ำสุด (node4 และ node5) =นาที (1, 3) =1
ต่ำสุด (node3) =ต่ำสุด (5) =5
ผลรวม =1 + 2 + 5 =8
เพื่อแก้ปัญหานี้ เราจะค้นหาโหนดที่เชื่อมต่อทั้งหมดของกราฟที่ไม่มีทิศทางโดยใช้เทคนิคการข้ามผ่าน (BFS หรือ DFS) จากนั้นสร้างอาร์เรย์ที่เข้าชมสำหรับโหนดทั้งหมดที่เข้าชมโดยที่ไม่มีการเข้าชมซ้ำ ในการเยี่ยมชมโหนดที่เชื่อมต่อที่เชื่อมต่อโดยตรงหรือโดยอ้อม เราจะค้นหาการเชื่อมต่อขั้นต่ำทั้งหมด และเพิ่มค่าต่ำสุดของตัวแปร thesum หลังจากที่เราไปเยี่ยมโหนดทั้งหมดแล้ว เราจะพิมพ์ผลรวมออกมา
ตัวอย่าง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
vector<int> graph[N];
bool visited[N];
void dfs(int node, int arr[], int minimum){
minimum = min(minimum, arr[node]);
visited[node] = true;
for (int i : graph[node]) {
if (!visited[i])
dfs(i, arr, minimum);
}
}
void createEdge(int u, int v){
graph[u - 1].push_back(v - 1);
graph[v - 1].push_back(u - 1);
}
int minSum(int arr[], int n){
int sum = 0;
for (int i = 0; i < n; i++) {
if (!visited[i]) {
int minimum = arr[i];
dfs(i, arr, minimum);
sum += minimum;
}
}
return sum;
}
int main(){
int arr[] = {2, 7, 5, 1, 3};
createEdge(1, 2);
createEdge(4, 5);
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"The sum of minimum elements in all connected components of an undirected graph is ";
cout<<minSum(arr, n);
return 0;
} ผลลัพธ์
The sum of minimum elements in all connected components of an undirected graph is 8