Home > Backend Development > C++ > C++ program to find the maximum sum of a minimally connected graph

C++ program to find the maximum sum of a minimally connected graph

WBOY
Release: 2023-09-13 13:53:13
forward
1183 people have browsed it

C++ program to find the maximum sum of a minimally connected graph

Suppose we have a minimally connected graph. This means that deleting any edge will disconnect the graph. The graph has n vertices and the edges are given in the array "edges". We also get an array "vertexValues" containing n integer values.

Now, we do the following -

  • We write a positive integer at each vertex and then try to calculate a fraction.

  • There is an edge connecting two vertices, and we put the smaller value of the two vertices on the edge.

  • We calculate the score by adding all edge values.

We have to find the maximum value which can be achieved by placing the value on the vertex. We have to print the maximum total value and the value to be written to the vertex.

So if the input is something like n = 6, then Edges = {{1, 2}, {2, 3} , {2, 4}, {4, 5}, {3, 6}} , vertexValues ​​= {1, 2, 3, 4, 5, 6}, then the output will be 15, 3 1 2 4 5 6, because we can put the values ​​from 0 in the given way 3 1 2 4 5 6 to the vertex n – 1.

To solve this problem we will follow the following steps-

N := 100
Define arrays seq and res of size N.
Define an array tp of size N.
ans := 0
Define a function dfs(), this will take p, q,
   res[p] := seq[c]
   if p is not equal to 0, then:
      ans := ans + seq[c]
   (decrease c by 1)
   for each value x in tp[p], do:
      if x is not equal to q, then:
         dfs(x, p)
for initialize i := 0, when i + 1 < n, update (increase i by 1), do:
   tmp := first value of edges[i]- 1
   temp := second value of edges[i] - 1
   insert temp at the end of tp[tmp]
   insert tmp at the end of tp[temp]
for initialize i := 0, when i < n, update (increase i by 1), do:
   seq[i] := vertexValues[i]
c := n - 1
sort the array seq
dfs(0, 0)
print(ans)
for initialize i := n - 1, when i >= 0, update (decrease i by 1), do:
   print(res[i])
Copy after login

Example

Let us see the following implementation for better understanding-

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
#define N 100
int seq[N], res[N];
vector<int> tp[N];
int ans = 0, c;

void dfs(int p, int q) {
   res[p] = seq[c];
   if(p != 0)
      ans += seq[c];
   c--;
   for(auto x : tp[p]) {
      if(x != q)
         dfs(x, p);
   }
}
void solve(int n, vector<pair<int,int>> edges, int vertexValues[]){
   for(int i = 0; i + 1 < n; i++) {
      int tmp = edges[i].first - 1;
      int temp = edges[i].second - 1;
      tp[tmp].push_back(temp);
      tp[temp].push_back(tmp);
   }
   for(int i = 0; i < n; i++)
      seq[i] = vertexValues[i];
   c = n - 1;
   sort(seq, seq + n);
   dfs(0, 0);
   cout << ans << endl;
   for(int i = n - 1; i >= 0; i--)
      cout << res[i] << " ";
   cout << endl;
}
int main() {
   int n = 6;
   vector<pair<int,int>> edges = {{1, 2}, {2, 3}, {2, 4}, {4, 5},{3, 6}};
   int vertexValues[] = {1, 2, 3, 4, 5, 6};
   solve(n, edges, vertexValues);
   return 0;
}
Copy after login

Input

6, {{1, 2}, {2, 3}, {2, 4}, {4, 5}, {3, 6}}, {1, 2, 3, 4, 5, 6}
Copy after login

Output

15
3 1 2 4 5 6
Copy after login

The above is the detailed content of C++ program to find the maximum sum of a minimally connected graph. For more information, please follow other related articles on the PHP Chinese website!

source:tutorialspoint.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template