题目链接:https://codeforces.com/contest/21/problem/D
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
static const int MAXN=15;
int f[MAXN][MAXN],d[MAXN];
int dp[1<<MAXN];
int n,m,u,v,w;
int ans;
int main()
{
scanf("%d%d",&n,&m);
memset(f,0x3f,sizeof(f));
for(int i=0;i<n;i++) f[i][i]=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
u--; v--;
f[u][v]=f[v][u]=min(f[u][v],w);
d[u]++; d[v]++;
ans+=w;
}
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<n;i++)
if(d[i] && f[0][i]==0x3f3f3f3f)
{
puts("-1");
return 0;
}
for(int k=0;k<1<<n;k++)
{
bool existed=false;
for(int i=0;i<n;i++)
if((d[i]&1) && (k>>i&1)) existed=true;
if(!existed) dp[k]=0;
for(int i=0;i<n;i++)
if((d[i]&1) && !(k>>i&1))
for(int j=i+1;j<n;j++)
if((d[j]&1) && !(k>>j&1))
dp[k|(1<<i)|(1<<j)]=min(dp[k|(1<<i)|(1<<j)],dp[k]+f[i][j]);
}
if(dp[(1<<n)-1]>=0x3f3f3f3f) puts("-1");
else printf("%d\n",ans+dp[(1<<n)-1]);
return 0;
}