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

ผลรวมขององค์ประกอบขั้นต่ำในส่วนประกอบที่เชื่อมต่อทั้งหมดของกราฟแบบไม่มีทิศทางใน C++


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

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

ป้อนข้อมูล

arr[] = {2, 7, 5, 1, 2} m = 2
1 2
4 5

ผลผลิต

8

คำอธิบาย

ด้านล่างเป็นกราฟที่แสดงด้านบน -

ผลรวมขององค์ประกอบขั้นต่ำในส่วนประกอบที่เชื่อมต่อทั้งหมดของกราฟแบบไม่มีทิศทางใน C++

เรามีโหนดที่เชื่อมต่ออยู่สองโหนดและโหนดเดียว

ดังนั้น มาดูส่วนประกอบที่เชื่อมต่อขั้นต่ำกัน

ต่ำสุด (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