using
System;
using
System.Collections.Generic;
class
Program
{
static
int
[,,] graph =
new
int
[18, 18, 2];
static
long
[,,] dp =
new
long
[1 << 18, 18, 2];
static
long
minCost(
int
n,
int
m,
int
mask,
int
prev,
int
col)
{
if
(mask == ((1 << n) - 1))
{
return
0;
}
if
(col!=1)col=0;
if
(dp[mask, prev, col] != 0)
{
return
dp[mask, prev, col];
}
long
ans = 1000000000;
for
(
int
i = 0; i < n; i++)
{
for
(
int
j = 0; j < 2; j++)
{
if
(graph[prev, i, j] != 0 && (mask & (1 << i)) == 0
&& (j != col))
{
long
z = graph[prev, i, j] + minCost(n, m, mask | (1 << i), i, j);
ans = Math.Min(z, ans);
}
}
}
return
dp[mask, prev, col] = ans;
}
static
void
MakeGraph(List<Tuple<Tuple<
int
,
int
>, Tuple<
int
,
char
>>> vp,
int
m)
{
for
(
int
i = 0; i < m; i++)
{
int
a = vp[i].Item1.Item1 - 1;
int
b = vp[i].Item1.Item2 - 1;
int
cost = vp[i].Item2.Item1;
char
color = vp[i].Item2.Item2;
graph[a, b, color ==
'W'
? 1 : 0] = cost;
graph[b, a, color ==
'W'
? 1 : 0] = cost;
}
}
static
int
GetCost(
int
n,
int
m)
{
long
ans = 1000000000;
for
(
int
i = 0; i < n; i++)
{
ans = Math.Min(ans, minCost(n, m, 1 << i, i, 2));
}
if
(ans != 1000000000)
{
return
(
int
)ans;
}
else
{
return
-1;
}
}
static
void
Main(
string
[] args)
{
int
n = 3, m = 4;
List<Tuple<Tuple<
int
,
int
>, Tuple<
int
,
char
>>> vp =
new
List<Tuple<Tuple<
int
,
int
>, Tuple<
int
,
char
>>>()
{
Tuple.Create(Tuple.Create(1, 2), Tuple.Create(2,
'B'
)),
Tuple.Create(Tuple.Create(1, 2), Tuple.Create(3,
'W'
)),
Tuple.Create(Tuple.Create(2, 3), Tuple.Create(4,
'W'
)),
Tuple.Create(Tuple.Create(2, 3), Tuple.Create(5,
'B'
))
};
MakeGraph(vp, m);
Console.WriteLine(GetCost(n, m));
}
}