#include #include using namespace std; typedef long long ll; const int INF = 1 << 28; const int N_MAX = 66; int dist[N_MAX][N_MAX]; int dp[1<<18][18]; bool can(vector vs, int K){ int N = (int)vs.size(); for(int mask=0;mask<1<> next) & 1)continue; int v = vs[last]; int u = vs[next]; dp[mask | (1 << next)][next] = min(dp[mask | (1 << next)][next], dp[mask][last] + dist[v][u]); } } for(int last=0;last> N >> M >> K; for(int i=0;i> U >> V; --U; --V; dist[U][V] = 1; dist[V][U] = 1; } for(int k=0;k use; use.push_back(0); for(int v=N-1;v>0 && use.size() - 1 < K;v--){ use.push_back(v); if(!can(use, K)){ use.pop_back(); } } ll res = 0; for(int v : use){ res += (1ll << v) - 1; } cout << res << endl; return 0; }