📌  相关文章
📜  无向图的所有连接组件中的最小元素的总和

📅  最后修改于: 2021-04-26 10:07:57             🧑  作者: Mango

给定一个由N个数字组成的数组A,其中A i表示第(i + 1)节点的值。还给出了M对边,其中u和v表示通过边连接的节点。任务是在给定无向图的所有连接组件中找到最小元素的总和。如果一个节点与其他任何节点均无连接,则将其视为具有一个节点的组件。

例子:

方法:查找无向图的连接组件是一项较容易的任务。从每个未访问的顶点开始执行BFS或DFS,将为我们提供连接的组件。创建一个visited []数组,该数组最初将所有节点标记为False。迭代所有节点,如果未访问该节点,则调用DFS()函数,以便将直接或间接连接到该节点的所有节点标记为已访问。访问所有直接或间接连接的节点时,请存储所有节点的最小值。创建一个变量sum ,该变量sum存储所有这些连接的组件的最小值的总和。一旦所有节点都被访问, sum将得到问题的答案。

下面是上述方法的实现:

// C++ program to find the sum
// of the minimum elements in all
// connected components of an undirected graph
#include 
using namespace std;
const int N = 10000;
vector 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;
}
输出:
15