using
System;
using
System.Collections;
using
System.Collections.Generic;
class
tree{
public
ArrayList g;
public
ArrayList chain;
public
int
minimum;
tree(
int
n)
{
g =
new
ArrayList();
chain =
new
ArrayList();
for
(
int
i = 0; i < n; i++)
{
g.Add(
new
ArrayList());
}
minimum = 1000000;
}
void
addEdge(
int
u,
int
v)
{
((ArrayList)g[v]).Add(u);
((ArrayList)g[u]).Add(v);
}
void
dfs(
int
v,
int
p = -1)
{
chain.Add(v);
foreach
(
int
i
in
(ArrayList)g[v])
{
if
(i == p)
continue
;
dfs(i, v);
}
}
void
check(
int
n,
int
a,
int
b,
ArrayList cost)
{
int
sum = 0;
ArrayList res =
new
ArrayList();
for
(
int
i = 0; i < n; i++)
{
res.Add(0);
}
res[0] = a;
res[1] = b;
sum += (
int
)((ArrayList)cost[a])[(
int
)chain[0]];
sum += (
int
)((ArrayList)cost[b])[(
int
)chain[1]];
for
(
int
i = 2; i < n; i++)
{
res[i] = 3 - (
int
)res[i - 1] - (
int
)res[i - 2];
sum += (
int
)((ArrayList)cost[(
int
)res[i]])[(
int
)chain[i]];
}
if
(sum < minimum)
minimum = sum;
}
void
minimumCost(
int
n,
ArrayList cost)
{
for
(
int
i = 0; i < n; i++)
{
if
(((ArrayList)g[i]).Count > 2)
{
Console.WriteLine(
"NOT POSSIBLE"
);
return
;
}
}
int
start = 0;
for
(
int
i = 0; i < n; i++)
{
if
(((ArrayList)g[i]).Count == 1)
start = i;
}
dfs(start);
check(n, 0, 1, cost);
check(n, 0, 2, cost);
check(n, 1, 0, cost);
check(n, 1, 2, cost);
check(n, 2, 0, cost);
check(n, 2, 1, cost);
Console.WriteLine(minimum);
}
public
static
void
Main(
string
[]args)
{
tree t =
new
tree(5);
t.addEdge(0, 1);
t.addEdge(1, 2);
t.addEdge(2, 3);
t.addEdge(3, 4);
ArrayList arr =
new
ArrayList();
arr.Add(
new
ArrayList(){ 3, 4, 2, 1, 2 });
arr.Add(
new
ArrayList(){ 4, 2, 1, 5, 4 });
arr.Add(
new
ArrayList(){ 5, 3, 2, 1, 1 });
t.minimumCost(5, arr);
}
}