// C# program to find maximum product
// of two non-intersecting paths
using System;
using System.Collections.Generic;
public class GFG
{
static int curMax;
// Returns maximum length path in
// subtree rooted at u after
// removing edge connecting u and v
static int dfs(List<int> []g,
int u, int v)
{
// To find lengths of first and
// second maximum in subtrees.
// currMax is to store overall
// maximum.
int max1 = 0, max2 = 0, total = 0;
// Loop through all neighbors of u
for(int i = 0; i < g[u].Count; i++)
{
// If neighbor is v, then skip it
if (g[u][i] == v)
continue;
// Call recursively with current
// neighbor as root
total = Math.Max(total, dfs(
g, g[u][i], u));
// Get max from one side and update
if (curMax > max1)
{
max2 = max1;
max1 = curMax;
}
else
max2 = Math.Max(max2, curMax);
}
// Store total length by adding max
// and second max
total = Math.Max(total, max1 + max2);
// Update current max by adding 1, i.e.
// current node is included
curMax = max1 + 1;
return total;
}
// Method returns maximum product of
// length of two non-intersecting paths
static int maxProductOfTwoPaths(List<int> []g,
int N)
{
int res = int.MinValue;
int path1, path2;
// One by one removing all edges and
// calling dfs on both subtrees
for(int i = 1; i < N + 2; i++)
{
for(int j = 0; j < g[i].Count; j++)
{
// Calling dfs on subtree rooted at
// g[i,j], excluding edge from g[i,j]
// to i.
curMax = 0;
path1 = dfs(g, g[i][j], i);
// Calling dfs on subtree rooted at
// i, edge from i to g[i,j]
curMax = 0;
path2 = dfs(g,i, g[i][j]);
res = Math.Max(res, path1 * path2);
}
}
return res;
}
// Utility function to add an
// undirected edge (u,v)
static void addEdge(List<int> []g,
int u, int v)
{
g[u].Add(v);
g[v].Add(u);
}
// Driver code
public static void Main(String[] args)
{
int [,]edges = { { 1, 8 }, { 2, 6 },
{ 3, 1 }, { 5, 3 },
{ 7, 8 }, { 8, 4 },
{ 8, 6 } };
int N = edges.GetLength(0);
// There are N edges, so +1 for nodes
// and +1 for 1-based indexing
List<int> []g = new List<int>[N + 2];
for(int i = 0; i < g.Length; i++)
g[i] = new List<int>();
for(int i = 0; i < N; i++)
addEdge(g, edges[i,0], edges[i,1]);
Console.Write(maxProductOfTwoPaths(g, N) + "\n");
}
}
// This code is contributed by aashish1995