Suma de los elementos mínimos en todos los componentes conectados de un gráfico no dirigido

Dada una array A de N números donde A i representa el valor del (i+1) Node . También se dan M pares de aristas donde u y v representan los Nodes que están conectados por una arista. La tarea es encontrar la suma del elemento mínimo en todos los componentes conectados del gráfico no dirigido dado. Si un Node no tiene conectividad con ningún otro Node, cuéntelo como un componente con un Node.

Ejemplos:

Entrada: a[] = {1, 6, 2, 7, 3, 8, 4, 9, 5, 10} m = 5
1 2
3 4
5 6
7 8
9 10

Salida: 15
Los componentes conectados son: 1–2, 3–4, 5–6, 7–8 y 9–10
Suma del mínimo de todos ellos: 1 + 2 + 3 + 4 + 5 = 15

Entrada: a[] = {2, 5, 3, 4, 8} m = 2
1 4
4 5
Salida: 10

Enfoque: encontrar componentes conectados para un gráfico no dirigido es una tarea más fácil. Hacer un BFS o DFS a partir de cada vértice no visitado nos dará nuestros componentes conectados. Cree una array visited[] que inicialmente tenga todos los Nodes marcados como False. Itere todos los Nodes, si el Node no se visita, llame a la función DFS() para que todos los Nodes conectados directa o indirectamente al Node se marquen como visitados. Mientras visita todos los Nodes conectados directa o indirectamente, almacene el valor mínimo de todos los Nodes. Cree una suma variable que almacene la suma del mínimo de todos estos componentes conectados. Una vez visitados todos los Nodes, sumatendrá la respuesta al problema.

A continuación se muestra la implementación del enfoque anterior:

// C++ program to find the sum
// of the minimum elements in all
// connected components of an undirected graph
#include <bits/stdc++.h>
using namespace std;
const int N = 10000;
vector<int> graph[N];
  
// Initially all nodes
// marked as unvisited
bool visited[N];
  
// DFS function that visits all
// connected nodes from a given node
void dfs(int node, int a[], int mini)
{
    // Stores the minimum
    mini = min(mini, a[node]);
  
    // Marks node as visited
    visited[node] = true;
  
    // Traversed in all the connected nodes
    for (int i : graph[node]) {
        if (!visited[i])
            dfs(i, a, mini);
    }
}
  
// Function to add the edges
void addedge(int u, int v)
{
    graph[u - 1].push_back(v - 1);
    graph[v - 1].push_back(u - 1);
}
  
// Function that returns the sum of all minimums
// of connected componenets of graph
int minimumSumConnectedComponents(int a[], int n)
{
    // Initially sum is 0
    int sum = 0;
  
    // Traverse for all nodes
    for (int i = 0; i < n; i++) {
        if (!visited[i]) {
            int mini = a[i];
            dfs(i, a, mini);
            sum += mini;
        }
    }
      
    // Returns the answer
    return sum;
}
  
// Driver Code
int main()
{
    int a[] = {1, 6, 2, 7, 3, 8, 4, 9, 5, 10};
      
    // Add edges
    addedge(1, 2);
    addedge(3, 4);
    addedge(5, 6);
    addedge(7, 8);
    addedge(9, 10);
      
    int n = sizeof(a) / sizeof(a[0]);
  
    // Calling Function
    cout << minimumSumConnectedComponents(a, n);
    return 0;
}
Producción:

15

Publicación traducida automáticamente

Artículo escrito por gopaldave y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *