给定一个由N个数字组成的数组A,其中A i表示第(i + 1)个节点的值。还给出了M对边,其中u和v表示通过边连接的节点。任务是在给定无向图的所有连接组件中找到最小元素的总和。如果一个节点与其他任何节点均无连接,则将其视为具有一个节点的组件。
例子:
Input: a[] = {1, 6, 2, 7, 3, 8, 4, 9, 5, 10} m = 5
1 2
3 4
5 6
7 8
9 10
Output: 15
Connected components are: 1–2, 3–4, 5–6, 7–8 and 9–10
Sum of Minimum of all them : 1 + 2 + 3 + 4 + 5 = 15
Input: a[] = {2, 5, 3, 4, 8} m = 2
1 4
4 5
Output: 10
方法:查找无向图的连接组件是一项较容易的任务。从每个未访问的顶点开始执行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