C ++中树中两个不相交的路径的最大乘积

在本教程中,我们将讨论一个程序,以查找树中两个不相交的路径的最大乘积。

为此,我们将提供一个具有n个节点的无向树。我们的任务是在树中找到两条路径,以使它们的乘积最大且不相交。

示例

#include <bits/stdc++.h>

using namespace std;

//返回最大长度路径

int dfs(vector<int> g[], int& curMax, int u, int v) {

   int max1 = 0, max2 = 0, total = 0;

   for (int i = 0; i < g[u].size(); i++) {

      if (g[u][i] == v)

         continue;

      total = max(total, dfs(g, curMax, g[u][i], u));

      if (curMax > max1) {

         max2 = max1;

         max1 = curMax;

      }

      else

         max2 = max(max2, curMax);

      }

      total = max(total, max1 + max2);

      curMax = max1 + 1;

      return total;

   }

   //返回非相交路径的乘积

   int maxProductOfTwoPaths(vector<int> g[], int N) {

      int res = INT_MIN;

      int path1, path2;

      for (int i = 0; i < N; i++) {

         for (int j = 0; j < g[i].size(); j++) {

            int curMax = 0;

            path1 = dfs(g, curMax, g[i][j], i);

            curMax = 0;

            path2 = dfs(g, curMax, i, g[i][j]);

            res = max(res, path1 * path2);

         }

      }

      return res;

   }

   void addEdge(vector<int> g[], int u, int v) {

      g[u].push_back(v);

      g[v].push_back(u);

   }

}

int main() {

   int edges[][2] = {{1, 8}, {2, 6}, {3, 1},{5, 3}, {7, 8}, {8, 4},{8, 6} };

   int N = sizeof(edges)/sizeof(edges[0]);

   vector<int> g[N + 2];

   for (int i = 0; i < N; i++)

      addEdge(g, edges[i][0], edges[i][1]);

   cout << maxProductOfTwoPaths(g, N) << endl;

   return 0;

}

输出结果

6

以上是 C ++中树中两个不相交的路径的最大乘积 的全部内容, 来源链接: utcz.com/z/322117.html

回到顶部