UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板
目录
- 思路
UVA10296 Jogging Trails
题目翻译:
给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图。问从任意一点出发,遍历所有的边,每条边至少访问一次,再回到起点,求满足要求的方案中走过的距离之和的最小短值。
思路
如果这个图是欧拉回路,那么很明显我们的答案就是欧拉回路的长度
欧拉回路的充要条件是图中度数为奇数的点的个数为0。
如果图不是欧拉回路,那么我们要做的就是添加一些边(实际上就是重复地经过一些边)使得它变成欧拉回路。
邮递员要完成任务就必须在某些街道上重复走若干次。如果重复走一次,就加一条平行边,于是原来对应的图形
就变成了多重图。只是要求加进的平行边的总权值最小就行了。于是,我们的问题就转化为,在一个有奇度数结点的赋权连通图中,增加一些平行边,使得新图不含奇度数结点,并且增加的边的总权值最小。
我们可以用Dijkstra对这些点求最短路(由于数据范围较小,用Floyd也没关系)。然后对所有点对之间的最短路构建新图。再对新图跑一般图最小权完美匹配。最后匹配出来的匹配就是重复走的路径长度。用老图的边权和加上新图的匹配就是答案。
然后因为一般图最大权匹配太难写了(200多行)本题的数据范围比较小(n<=15n<=15n<=15)这不就是暗示我们要用状压DP来解决嘛。
使用状压DP实际上就是艺术地暴力枚举所有的情况。
我们把所有度数为奇数的点存下来,
从状态0(所有奇数度点的状态)开始,最终的状态为(1<<top )- 1
表示所有原来度数为奇数的点都变成了偶数。
由于我们的操作是每次加一条边,就可以形象地看作将两个点从度数为奇数点变成度数为偶数点。
因此状压DP的时候每次找两个点使得他们从0变成1(我们用0表示该点是度数为奇数的点,1表示该点是度数为偶数的点。)我们最终的状态是所有的点变成度数为偶数,这样存在欧拉回路的情况(我们每次选择两个点让他们从0变成1实际上就是让他们连边,度数从两个奇数变成两个偶数。)
最后输出所有边权之和加上状压DP求的使得所有点都变成度数为偶数的点的最小代价(边的距离)
状压DP分析参考
状态表示:
用一串二进制数,第i位数表示第i个点是否为奇度点,0表示不是,1表示是。例如00110101表示1、3、5、6点的度数为奇数。
每个状态划分为一个阶段。
阶段状态转移:
每个状态可以从当前状态任意使两个1变为0 的状态转移而来,也就是说从删除一条边变为当前状态的状态转移而来。
比如说00110101可以从6个状态转移而来:00000101、00110000、00010001、00100001、00010100、00100100
无后效应:
如果当前状态是通过之前的一条转移路径转移而来,不会导致之后有些本该转移的状态不可转移。
例如:当前为00110101,无论之前如何转移,之后一定可以转移成00111111
最优子结构:
当前状态储存的值为在当前状态的情况下所需要的最少距离,这个值的转移方程为:
f[cur]=min{f[pre]+dis[pre][cur]} (要求:pre状态可以转移到cur状态,dis[pre][cur]为删除的虚拟边的距离)
来源 https://www.cnblogs.com/wuminye/archive/2013/05/06/3063902.html
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;const int N = 20, M = (1 << 20) + 5, INF = 0x3f3f3f3f;int n, m;
int f[M];
int dist[N][N];
int q[N], top;
int d[N];
int sum;void floyd()
{for(int k = 1; k <= n; ++ k)for(int i = 1; i <= n; ++ i)if(dist[i][k] < INF)for(int j = 1; j <= n; ++ j)dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}void dp()
{memset(f, 0x3f, sizeof f);f[0] = 0;for(int s = 0; s < (1 << top); ++ s){int i = 0;while(s & (1 << i))i ++ ;//第一对1和0for(int j = i + 1; j < top; ++ j){if((s & (1 << j)) == 0)//第二对1和0f[s | (1 << i) | (1 << j)] = min(f[s | (1 << i) | (1 << j)], f[s] + dist[q[i]][q[j]]);}}
}
int main()
{while(scanf("%d", &n) != EOF && n){scanf("%d", &m);top = sum = 0;memset(d, 0, sizeof d);memset(dist, 0x3f, sizeof dist);for(int i = 1; i <= m; ++ i){int x, y, w;scanf("%d%d%d", &x, &y, &w);dist[x][y] = dist[y][x] = min(dist[x][y], w);d[x] ++ , d[y] ++ ;sum += w;//要求所有的边都过一遍}for(int i = 1; i <= n; ++ i){if(d[i] & 1)q[top ++ ] = i;}floyd();//这里相当于是添加的边dp();printf("%d\n", f[(1 << top) - 1] + sum);}return 0;
}
UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)相关推荐
- [中国邮路问题 欧拉回路 最短路 一般图匹配||状压DP] FZU 1009 Jogging Trails
论文:仇荣琦<欧拉回路性质与应用探究> 本来以为完全图匹配有什么高深的算法 结果去看参考资料里的论文就是带花树 汗 这道题n小 状压每个点的奇偶性 #include<cstdio&g ...
- [UVa10296]Jogging Trails
题目大意: 中国邮递员问题. 给你一个无向带权连通图,求经过所有边并返回起点的最短路径. 思路: Edmonds-Johnson算法. 显然,当原图为欧拉图时,答案即为其欧拉回路的长度. 考虑原图不存 ...
- CodeForces 11D(状压DP 求图中环的个数)
Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...
- bzoj 4479: [Jsoi2013]吃货jyy 欧拉回路+状压dp
题意 世界上一共有N个JYY愿意去的城市,分别从1编号到N.JYY选出了K个他一定要乘坐的航班.除此之外,还有M个JYY没有特别的偏好,可以乘坐也可以不乘坐的航班. 一个航班我们用一个三元组(x,y, ...
- P6085-[JSOI2013]吃货JYY【状压dp,欧拉回路】
正题 题目链接:https://www.luogu.com.cn/problem/P6085 题目大意 nnn个点的一张无向图,有kkk条必走边,mmm条其他边,求从111出发经过必走边后回到起点的最 ...
- [状压DP][欧拉回路]吃货JYY
题目描述 世界上一共有N个JYY愿意去的城市,分别从1编号到N.JYY选出了K个他一定要乘坐的航班.除此之外,还有M个JYY没有特别的偏好,可以乘坐也可以不乘坐的航班. 一个航班我们用一个三元组(x, ...
- hdu 4568 Hunter bfs建图+TSP状压DP
想AC的人请跳过这一段... 题目应该都能读懂.但是个人觉得这题出的很烂,意思太模糊了. 首先,进出次数只能是一次!!这个居然在题目中没有明确说明,让我在当时看到题目的时候无从下手. 因为我想到了这几 ...
- 【NOIP模拟】T2 管道(状压dp求图的dfs序方案数)
f[i][j]: i表示整个图走没走过的状态 j表示当前到了第j个点 存的值就是在这种情形下 可以走到的地方的状态 dp[i][j]:i表示整个图走没走过的状态 j表示当前在j点 访问剩余能去到的点的 ...
- 【省选专题一】图论 jzoj 3290【JSOI2013】吃货JYY 状压dp+欧拉回路
Description 世界上一共有N个JYY愿意去的城市,分别从1编号到N.JYY选出了K个他一定要乘坐的航班.除此之外,还有M个JYY没有特别的偏好,可以乘坐也可以不乘坐的航班. 一个航班我们用一 ...
最新文章
- 伍六七带你学算法 入门篇——最后一个单词的长度
- bat递归查找指定文件_dos命令find图文教程,查找搜索文件文本字符串,bat批处理脚本...
- 疫苗有效,先抛股票,今日官宣94.5%结果的Moderna高管早有信心
- 为什么说多道程序概念得到了中断和通道技术的支持?
- spring配置c3p0连接池、spring的声明式事务管理
- linux下安装jdk,非常简单的操作
- sqlite3 编译问题
- 上万规模数据湖如何在实验室测试
- 如何格式化电脑_计算机格式化的方法教程
- Qt实践录:常见控件操作示例2
- 政府安全资讯精选 2017年第十八期 工信部近三年将466个“问题APP”纳入黑名单;阿里云成为全球唯一完成德国C5云安全基础附加标准审计云服务商...
- [Windows]win10时间同步错误的解决方法
- Python沪深300成分股价值分析
- Python3抓取猫眼电影排行
- postman全方位讲解(有空看下)
- 百度信誉保障服务架构全解析
- 华为云免费试用_如何试用华为云服务器
- 卷积神经网络学习路线(二十一) | 旷世科技 ECCV 2018 ShuffleNet V2
- Android开发者上手宝典(三)
- java判断txt文件的编码格式