/*
状压dp
邮递员问题:求经过任意点出发经过每一条边一次并回到原点。
解法:1、如果是欧拉回路那么就是所有的边的总和。
2、一般的解法,找出所有的奇度顶点,任意两个顶点匹配,即最小完美匹配,可用状压dp。
*/
#include<stdio.h>
#include<string.h>
#define N 20
#define inf 1000000000
int ma[N][N];
int lower[N];
int dp[1<<16];//注意这里数组要开够
void floyd(int n) {
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) {
if(ma[i][k]>=inf||ma[k][j]>=inf)continue;
if(ma[i][j]>ma[i][k]+ma[k][j])
ma[i][j]=ma[i][k]+ma[k][j];
}
return ;
}
int vis[N];
int judge(int n) {
int k=0,num=0;
while(n) {
vis[k]=n%2;
if(vis[k])
num++;
n/=2;
k++;
}
return num;
}
int main() {
int n,m,i,j,k,sum,degree[N],f,to[N],low,last;
lower[0]=1;
for(i=1;i<=17;i++)//二进制
lower[i]=lower[i-1]*2;
while(scanf("%d",&n),n) {
scanf("%d",&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
ma[i][j]=(i==j)?0:inf;
memset(degree,0,sizeof(degree));
sum=0;
while(m--) {
scanf("%d%d%d",&i,&j,&k);
if(ma[i][j]>k)
ma[i][j]=ma[j][i]=k;
degree[i]++;//求解度数
degree[j]++;
sum+=k;
}
f=0;
for(i=1;i<=n;i++)
if(degree[i]%2==1)
to[f++]=i;
if(f==0) {//判断是否是欧拉回路
printf("%d\n",sum);
continue;
}
floyd(n);//求解任意两点的距离实际用的只有奇度顶点
// printf("z\n");
low=1<<f;
for(i=1;i<low;i++)//初始化
dp[i]=inf;
dp[0]=0;
//printf("%d\n",f);
for(i=1;i<low;i++) {
memset(vis,0,sizeof(vis));
if(judge(i)%2==1)continue;//如果是奇数不符合
for(j=0;j<f;j++)
for(k=0;k<f;k++) {
if(j==k)continue;//不能相同
if(!vis[j]||!vis[k])continue;//只要有一个没有就不符合
last=i^lower[j]^lower[k];
if(dp[i]>dp[last]+ma[to[j]][to[k]])//当前的状态=去掉j和k的状态+j和k的最短路
dp[i]=dp[last]+ma[to[j]][to[k]];
}
}
// printf("%d\n",dp[low-1]);
printf("%d\n",sum+dp[low-1]);//奇度顶点的总的最小匹配为重复边+总的边数
}
return 0;
}

最新文章

  1. php-4种排序
  2. 【转】优化Web程序的最佳实践
  3. Refusing to install webpack as a dependency of itself
  4. nginx 502
  5. 给Ubuntu安装KDE桌面 [转]
  6. [LeetCode141]Linked List Cycle
  7. JDK中的Timer和TimerTask详解
  8. 【BZOJ 2713】[Violet 2]愚蠢的副官&amp;&amp;【BZOJ1183】[Croatian2008]Umnozak——【数位DP】
  9. Flutter之List
  10. JS输入框正则校验
  11. Mybatis时间段比较
  12. R: Coercing LHS to a list
  13. zabbix监控常见系统报错
  14. ASP.NET MVC5+EF6+LayUI实战教程,通用后台管理系统框架(6)- 创建数据库
  15. Linux下进程隐藏的方法及其对抗
  16. 网格布局(GridLayout) 行数与列数
  17. 高性能Web服务器Nginx的配置与部署研究(15)Upstream负载均衡模块
  18. 使用js命名空间进行模块式开发
  19. vs2017取消起始页(设定起始页)/(.ashx文件的添加)
  20. log4j+AOP 记录错误日志信息到文件中

热门文章

  1. bzoj 1682: [Usaco2005 Mar]Out of Hay 干草危机【并查集+二分】
  2. 17年day5
  3. Math teacher&#39;s homework
  4. I - Andy&#39;s First Dictionary(set+stringstream)
  5. web api 二
  6. zepto中给不存在的元素设置样式并绑定事件的坑
  7. MySql学习笔记(2)-简介
  8. duilib属性
  9. React 篇 Comment Model
  10. Python批量下载电视剧电影--自己动手丰衣足食