寻找无向图的最重路径
Finding the heaviest path of an undirected graph
我正在尝试解决一个特定问题,但我找不到任何合适的解决方案。
我会解释......我有一个图表,其中每个节点都有一个数值。
从我选择的节点开始,我必须找到节点值之和最重的路径。
然而,这个问题的特殊之处在于,我只能通过同一个桥一次,但可以在同一个节点上通过多次。
更准确地说,如果我有这种类型的图表
从节点1开始,我应该得到的解决方案是这样的:
1->2->0->1->4 总权重为23.
我尝试应用已知的算法,例如 Dijkstra 或 Prime,但我认为它们不是正确的解决方案。
我在互联网上找不到太多。有谁能给我任何解释或建议吗?
考虑给拱门上色而不是结上色是否可以让我找到你认为的解决方案?
一千个感谢
我使用这样的 dfs 变体解决了这个问题:
int dfs(vector<vector<int> >& g,
int* cost, int u, int pre){
vis[u] = true;
dp[u] = cost[u];
bool check = 1;
int cur = cost[u];
for (auto& x : g[u]) {
if (vis[x] && x != pre) {
check = 0;
}
else if (!vis[x]) {
check &= dfs(g, cost, x, u);
cur = max(cur, cost[u] + dp[x]);
}
}
dp[u] = cur;
if (!check) {
canTake += cost[u];
path.push_back(u);
}
else {
best = max(best, dp[u]);
last_node = u;
}
return check;
}
我正在尝试解决一个特定问题,但我找不到任何合适的解决方案。 我会解释......我有一个图表,其中每个节点都有一个数值。 从我选择的节点开始,我必须找到节点值之和最重的路径。 然而,这个问题的特殊之处在于,我只能通过同一个桥一次,但可以在同一个节点上通过多次。
更准确地说,如果我有这种类型的图表
从节点1开始,我应该得到的解决方案是这样的: 1->2->0->1->4 总权重为23.
我尝试应用已知的算法,例如 Dijkstra 或 Prime,但我认为它们不是正确的解决方案。 我在互联网上找不到太多。有谁能给我任何解释或建议吗? 考虑给拱门上色而不是结上色是否可以让我找到你认为的解决方案? 一千个感谢
我使用这样的 dfs 变体解决了这个问题:
int dfs(vector<vector<int> >& g,
int* cost, int u, int pre){
vis[u] = true;
dp[u] = cost[u];
bool check = 1;
int cur = cost[u];
for (auto& x : g[u]) {
if (vis[x] && x != pre) {
check = 0;
}
else if (!vis[x]) {
check &= dfs(g, cost, x, u);
cur = max(cur, cost[u] + dp[x]);
}
}
dp[u] = cur;
if (!check) {
canTake += cost[u];
path.push_back(u);
}
else {
best = max(best, dp[u]);
last_node = u;
}
return check;
}