#include #include #include using namespace std; vector > graph[105]; int dp[20][1 << 20]; int travelling_salesman(int node, int visited) { if(__builtin_popcount(visited) == 1) { for(int i = 0; i < graph[node].size(); i++) { if(graph[node][i].first == 0) { return graph[node][i].second; } } return 0; } if(node == 0 and visited == 0) { return 0; } if(dp[node][visited] != -1) { return dp[node][visited]; } int new_mask = visited; new_mask -= (1 << node); int result = 2e9; for(int i = 0; i < graph[node].size(); i++) { int sosed = graph[node][i].first; int weight = graph[node][i].second; if(visited & (1 << sosed)) { result = min(result, travelling_salesman(sosed, new_mask) + weight); } } return dp[node][visited] = result; } int main() { int n, m; cin >> n >> m; memset(dp, -1, sizeof dp); for(int i = 0; i < m; i++) { int a, b, c; cin >> a >> b >> c; a--; b--; graph[a].push_back(make_pair(b, c)); graph[b].push_back(make_pair(a, c)); } int mask = (1 << (n)) - 1; cout << travelling_salesman(0, mask) << endl; return 0; } /* 4 6 1 2 10 2 4 25 2 3 35 3 4 30 3 1 15 4 1 20 */