Problem:
Traveling Salesman Problem

For a given weighted directed graph G(V, E), find the distance of the shortest route that meets the following criteria:

It is a closed cycle where it ends at the same point it starts.

It visits each vertex exactly once.

Input

|V| |E|
s0 t0 d0
s1 t1 d1
:
s|E|-1 t|E|-1 d|E|-1

|V| is the number of vertices and |E| is the number of edges in the graph. The graph vertices are named with the numbers 0, 1,..., |V|-1 respectively.

si and ti represent source and target vertices of i-th edge (directed) and di represents the distance between si and ti (the i-th edge).

Output

Print the shortest distance in a line. If there is no solution, print -1.

Constraints

2 ≤ |V| ≤ 15

0 ≤ di ≤ 1,000

There are no multiedge

Sample Input 1

4 6
0 1 2
1 2 3
1 3 9
2 0 1
2 3 6
3 2 4

Sample Output 1

16

Sample Input 2

3 3
0 1 1
1 2 1
0 2 1

Sample Output 2

-1

Solution in C# (judge verdict: Accepted)

using System;
using System.Linq;//リストの使用
using System.Collections.Generic;
using System.Text;//テキストの高速出力に必要
class Program
{
	static void Main()
	{
		string[] input = Console.ReadLine().Split(' ');
		int v = int.Parse(input[0]);
		int e = int.Parse(input[1]);
    long[,] distance = new long[v,v];
    long[,] dp = new long[1<<v, v];//dp[スタートを除く訪問した頂点,今いる頂点] := 通った距離
    long answer = long.MaxValue/2;

    for(int i = 0; i < v; i++)
    {
      for(int j = 0; j < v; j++)
      {
        distance[i,j] = -1;
      }
    }

    for(int i = 0; i < e; i++)
    {
      string[] inputa = Console.ReadLine().Split(' ');
      distance[int.Parse(inputa[0]), int.Parse(inputa[1])] = long.Parse(inputa[2]);
    }

    for(int i = 0; i < 1<<v; i++)
    {
      for(int j = 0; j < v; j++)
      {
        dp[i,j] = long.MaxValue/2;
      }
    }
    dp[1,0] = 0;//初期化

    for(int i = 2; i < 1<<v; i++)
    {
      for(int next = 0; next < v; next++)
      {
        if(((i>>next)&1) == 1)
        {
          for(int back = 0; back < v; back++)
          {
            if(distance[back, next] != -1 && dp[i^(1<<next),back] != long.MaxValue/2)
            {
              dp[i,next] = Math.Min(dp[i,next], dp[i^(1<<next),back]+distance[back,next]);
              //Console.WriteLine(i+" "+next+" "+dp[i,next]);
            }
          }
        }
      }
    }

    for(int i = 1; i < v; i++)
    {
      //Console.WriteLine(dp[(1<<v)-1, i]+" "+((1<<v)-1)+" "+v);
      if(dp[(1<<v)-1, i] != long.MaxValue/2 && distance[i,0] != -1)
      {
        answer = Math.Min(answer, dp[(1<<v)-1, i] + distance[i,0]);
      }
    }
		
		Console.WriteLine(answer == long.MaxValue/2 ? -1 : answer);
	}
}