POJ 2404 Jogging Trails [DP 状压 一般图最小权完美匹配]
题意:找一个经过所有边权值最小的回路,$n \le 15$
所有点度数为偶则存在欧拉回路,直接输出权值和
否则考虑度数为奇的点,连着奇数条边,奇点之间走已经走过的路移动再走没走过的路
然后大体想一想就是权值和加上奇点的最小权匹配啦
蒟蒻不会带花树就打了状压$DP$
$f[s]$表示已经选的集合为$s$,考虑当前未选的最小点和哪一个未选的点匹配
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=,S=(<<)+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int n,m,u,v,w,d[N][N],de[N];
void floyd(){
for(int k=;k<=n;k++)
for(int i=;i<=n;i++) if(d[i][k]<INF)
for(int j=;j<=n;j++)
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
int a[N],p,f[S];
void dp(){
//for(int i=1;i<=p;i++) printf("a %d\n",a[i]);
memset(f,0x3f,sizeof(f));
f[]=;
int All=<<p;
for(int s=;s<All;s++){
int i=;
while((<<i)&s) i++;
for(int j=i+;j<p;j++) if( !((<<j)&s) )
f[s|(<<i)|(<<j)]=min(f[s|(<<i)|(<<j)],f[s]+d[a[i]][a[j]]);
}
}
int main(){
freopen("in","r",stdin);
while( (n=read()) ){
m=read();
for(int i=;i<=n;i++){
de[i]=;
for(int j=;j<=n;j++) if(i!=j) d[i][j]=INF;
}
int sum=;
for(int i=;i<=m;i++){
u=read(),v=read(),w=read();
d[u][v]=d[v][u]=min(d[u][v],w); sum+=w;
de[u]++;de[v]++;
}
p=;
for(int i=;i<=n;i++) if(de[i]&) {a[p++]=i;}
if(!p) {printf("%d\n",sum);continue;} floyd();
dp();
printf("%d\n",sum+f[(<<p)-]);
}
}
POJ 2404 Jogging Trails [DP 状压 一般图最小权完美匹配]的更多相关文章
- POJ 2404 Jogging Trails(最小权完美匹配)
[题目链接] http://poj.org/problem?id=2404 [题目大意] 给出一张图,求走遍所有的路径至少一次,并且回到出发点所需要走的最短路程 [题解] 如果图中所有点为偶点,那么一 ...
- lightoj 1086 - Jogging Trails(状压dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1086 题解:题目就是求欧拉回路然后怎么判断有欧拉回路只要所有点的度数为偶数.那 ...
- POJ 2404 Jogging Trails
Jogging Trails Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2122 Accepted: 849 Des ...
- poj 2288 Islands and Bridges ——状压DP
题目:http://poj.org/problem?id=2288 状压挺明显的: 一开始写了(记忆化)搜索,但一直T: #include<iostream> #include<cs ...
- 【HDU】4352 XHXJ's LIS(数位dp+状压)
题目 传送门:QWQ 分析 数位dp 状压一下现在的$ O(nlogn) $的$ LIS $的二分数组 数据小,所以更新时直接暴力不用二分了. 代码 #include <bits/stdc++. ...
- 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP
[题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...
- POJ 3565 Ants 【最小权值匹配应用】
传送门:http://poj.org/problem?id=3565 Ants Time Limit: 5000MS Memory Limit: 65536K Total Submissions: ...
- 【POJ 2195】 Going Home(KM算法求最小权匹配)
[POJ 2195] Going Home(KM算法求最小权匹配) Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
随机推荐
- HDU--1060
Leftmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- c语言基础学习07_关于指针的复习
============================================================================= 指针变量之间赋值是需要兼容的. 例如:int ...
- spring的applicationContext.xml没有自动提示(使用本地的文档)
http://www.springframework.org/schema/beans/spring-beans.xsd Window>>preference>>搜索xml(X ...
- 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类
一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...
- Linux的软件安装(JDK安装,Mysql安装,Tomcat安装)
1.JDK安装 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看当前Linux系统是否已经安装java 输入 rpm -qa | grep java ps:博主这 ...
- 深入理解:Linear Regression及其正则方法
这是最近看到的一个平时一直忽略但深入研究后发现这里面的门道还是很多,Linear Regression及其正则方法(主要是Lasso,Ridge, Elastic Net)这一套理论的建立花了很长一段 ...
- HTML <select>标签
1.简单的下拉列表 <html> <body> <form> 名: <select name="firstname"> <op ...
- Struts2获取Session的三种方式
1.Map<String,Object> session = ActionContext.getContext().getSession(); session.put("cod ...
- properties文件中中文不能显示或者中文乱码
1.properties 文件中文乱码问题 鼠标“右击”文件 => Resource => Text file encoding => UTF-8 2.properties 文件解析 ...
- 流程控制语句if、else、elif、break、continue
1.控制流程 # if 判断语句 a = 12 if a>0: print('a大于0') if a<5: print('a大于5') else: print('哈哈哈') 2.基本形式: ...