using
System;
using
System.Collections.Generic;
using
System.Linq;
public
class
GFG
{
static
void
addEdge(List<
int
>[] adj,
int
x,
int
y)
{
adj[x].Add(y);
adj[y].Add(x);
}
static
void
dfs(List<
int
>[] adj,
int
node,
int
l,
int
p,
int
[] lvl,
int
[] par)
{
lvl[node] = l;
par[node] = p;
foreach
(
int
child
in
adj[node])
{
if
(child != p)
dfs(adj, child, l + 1, node, lvl, par);
}
}
static
int
LCA(
int
a,
int
b,
int
[] par,
int
[] lvl)
{
if
(lvl[a] > lvl[b])
(a, b) = (b, a);
int
diff = lvl[b] - lvl[a];
while
(diff != 0)
{
b = par[b];
diff--;
}
if
(a == b)
return
a;
while
(a != b)
(a, b) = (par[a], par[b]);
return
a;
}
static
void
printPath(List<
int
>[] adj,
int
a,
int
b,
int
n)
{
int
[] lvl =
new
int
[n + 1];
int
[] par =
new
int
[n + 1];
dfs(adj, 1, 0, -1, lvl, par);
int
lca = LCA(a, b, par, lvl);
List<
int
> path =
new
List<
int
>();
while
(a != lca)
{
path.Add(a);
a = par[a];
}
path.Add(a);
List<
int
> temp =
new
List<
int
>();
while
(b != lca)
{
temp.Add(b);
b = par[b];
}
temp.Reverse();
foreach
(
int
x
in
temp)
path.Add(x);
for
(
int
i = 0; i < path.Count() - 1; i++)
Console.Write(path[i] +
" -> "
);
Console.WriteLine(path[path.Count() - 1]);
}
static
void
Main()
{
int
n = 8;
List<
int
>[] adj =
new
List<
int
>[n + 1];
for
(
int
i = 0; i <= n; i++)
{
adj[i] =
new
List<
int
>();
}
addEdge(adj, 1, 2);
addEdge(adj, 1, 7);
addEdge(adj, 2, 3);
addEdge(adj, 2, 6);
addEdge(adj, 3, 4);
addEdge(adj, 3, 8);
addEdge(adj, 3, 5);
int
a = 4, b = 7;
printPath(adj, a, b, n);
}
}