#include #include #include #include using namespace std; int n, m, k; vector > graph[40005]; vectorv; struct node{ int idx; int cost; node(){ } node(int _idx, int _cost){ idx=_idx; cost=_cost; } bool operator < (const node &temp) const{ return cost > temp.cost; } }; int dist[40005]; vector > G[20]; long long dijsktra(int s){ bool visited[n + 5]; for(int i=0; i<=n; i++){ visited[i]=false; dist[i] = 2e9; } priority_queuepq; pq.push(node(s, 0)); dist[s] = 0; while(!pq.empty()){ node c=pq.top(); pq.pop(); visited[c.idx]=true; for(int i=0; i c.cost + pom)){ pq.push(node(sosed, pom)); dist[sosed]=c.cost+pom; } } } return 0; } int dp[16][1 << 16]; int travelling_salesmane(int node, int visited) { if(__builtin_popcount(visited) == 1) { for(int i = 0; i < G[node].size(); i++) { if(G[node][i].first == 0) { return G[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 < G[node].size(); i++) { int sosed = G[node][i].first; int weight = G[node][i].second; if(visited & (1 << sosed)) { result = min(result, travelling_salesmane(sosed, new_mask) + weight); } } return dp[node][visited] = result; } int main() { cin>>n>>k>>m; for(int i=0; i>p; v.push_back(p); } for(int i=0; i>a; cin>>b >> c; graph[a].push_back(make_pair(b, c)); graph[b].push_back(make_pair(a, c)); } v.push_back(0); for(int i = 0; i < v.size(); i++) { dijsktra(v[i]); for(int j = 0; j < v.size(); j++) { if(v[i] != v[j]) { G[v[i]].push_back(make_pair(v[j], dist[v[j]])); G[v[j]].push_back(make_pair(v[i], dist[v[j]])); } } } int p = (int) v.size(); for(int i = 0; i < v.size(); i++) { for(int j = 0; j < G[i].size(); j++) { // cout << i << " " << G[i][j].first << " " << G[i][j].second << endl; } } memset(dp, -1, sizeof dp); cout << travelling_salesmane(0, (1 << p) - 1) << endl; return 0; }