假设我们有一个最小连通图。这意味着删除任何边都会使图断开连接。该图有 n 个顶点,边在数组“edges”中给出。我们还获得了一个包含 n 个整数值的数组“vertexValues”。
现在,我们执行以下操作 -
我们在每个顶点上写一个正整数,然后尝试计算一个分数。
有一条边连接两个顶点,我们将两个顶点中较小的值放在边缘。
我们通过添加所有边缘值来计算分数。
我们必须找到最大值可以通过将值放在顶点上来实现。我们必须打印最大总值以及要写入顶点的值。
因此,如果输入类似于 n = 6,则 Edges = {{1, 2}, {2, 3} , {2, 4}, {4, 5}, {3, 6}}, vertexValues = {1, 2, 3, 4, 5, 6},则输出将为 15, 3 1 2 4 5 6,因为我们可以按照给定的方式 3 1 2 4 5 6 将值放在从 0 到 n – 1 的顶点上。
为了解决这个问题,我们将遵循以下步骤 -
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])
让我们看看以下实现,以便更好地理解 -
#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; }
6, {{1, 2}, {2, 3}, {2, 4}, {4, 5}, {3, 6}}, {1, 2, 3, 4, 5, 6}
15 3 1 2 4 5 6
以上是C++程序用于找到最小连接图的最大和的详细内容。更多信息请关注PHP中文网其他相关文章!