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)

// AOJ DPL_2_A Traveling Salesman Problem
// 2018.5.5 bal4u

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if 1
#define gc() getchar_unlocked()
#else
#define gc() getchar()
#endif

int in()
{
	int n = 0, c = gc();
	do n = 10*n + (c & 0xf), c = gc(); while (c >= '0');
	return n;
}

#define INF 0x03030303

#define MAX_V  16
int dp[1<<MAX_V][MAX_V];
int d[MAX_V][MAX_V];

int traveling_salesman(int V)
{
	int s, u, v, x;

	memset(dp, INF, sizeof(dp));
	dp[(1<<V)-1][0] = 0;
	for (s = (1<<V)-2; s >= 0; s--) {
		for (v = 0; v < V; v++) {
			for (u = 0; u < V; u++) if (d[v][u] < INF) {
				if ((s>>u) & 1) continue;
				x = dp[s | (1<<u)][u] + d[v][u];
				if (x < dp[s][v]) dp[s][v] = x;
			}
		}
	}
	return dp[0][0];
}

int main()
{
	int V, E, ans;

	memset(d, INF, sizeof(d));
	V = in(), E = in();
	if (!E) { puts("-1"); return 0; }

	while (E--) {
		int s = in(), t = in();
		d[s][t] = in();
	}
	ans = traveling_salesman(V);
	if (ans >= INF) puts("-1");
	else printf("%d\n", ans);
	return 0;
}