整理的算法模板合集: 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)相关推荐

  1. [中国邮路问题 欧拉回路 最短路 一般图匹配||状压DP] FZU 1009 Jogging Trails

    论文:仇荣琦<欧拉回路性质与应用探究> 本来以为完全图匹配有什么高深的算法 结果去看参考资料里的论文就是带花树 汗 这道题n小 状压每个点的奇偶性 #include<cstdio&g ...

  2. [UVa10296]Jogging Trails

    题目大意: 中国邮递员问题. 给你一个无向带权连通图,求经过所有边并返回起点的最短路径. 思路: Edmonds-Johnson算法. 显然,当原图为欧拉图时,答案即为其欧拉回路的长度. 考虑原图不存 ...

  3. CodeForces 11D(状压DP 求图中环的个数)

    Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...

  4. bzoj 4479: [Jsoi2013]吃货jyy 欧拉回路+状压dp

    题意 世界上一共有N个JYY愿意去的城市,分别从1编号到N.JYY选出了K个他一定要乘坐的航班.除此之外,还有M个JYY没有特别的偏好,可以乘坐也可以不乘坐的航班. 一个航班我们用一个三元组(x,y, ...

  5. P6085-[JSOI2013]吃货JYY【状压dp,欧拉回路】

    正题 题目链接:https://www.luogu.com.cn/problem/P6085 题目大意 nnn个点的一张无向图,有kkk条必走边,mmm条其他边,求从111出发经过必走边后回到起点的最 ...

  6. [状压DP][欧拉回路]吃货JYY

    题目描述 世界上一共有N个JYY愿意去的城市,分别从1编号到N.JYY选出了K个他一定要乘坐的航班.除此之外,还有M个JYY没有特别的偏好,可以乘坐也可以不乘坐的航班. 一个航班我们用一个三元组(x, ...

  7. hdu 4568 Hunter bfs建图+TSP状压DP

    想AC的人请跳过这一段... 题目应该都能读懂.但是个人觉得这题出的很烂,意思太模糊了. 首先,进出次数只能是一次!!这个居然在题目中没有明确说明,让我在当时看到题目的时候无从下手. 因为我想到了这几 ...

  8. 【NOIP模拟】T2 管道(状压dp求图的dfs序方案数)

    f[i][j]: i表示整个图走没走过的状态 j表示当前到了第j个点 存的值就是在这种情形下 可以走到的地方的状态 dp[i][j]:i表示整个图走没走过的状态 j表示当前在j点 访问剩余能去到的点的 ...

  9. 【省选专题一】图论 jzoj 3290【JSOI2013】吃货JYY 状压dp+欧拉回路

    Description 世界上一共有N个JYY愿意去的城市,分别从1编号到N.JYY选出了K个他一定要乘坐的航班.除此之外,还有M个JYY没有特别的偏好,可以乘坐也可以不乘坐的航班. 一个航班我们用一 ...

最新文章

  1. 伍六七带你学算法 入门篇——最后一个单词的长度
  2. bat递归查找指定文件_dos命令find图文教程,查找搜索文件文本字符串,bat批处理脚本...
  3. 疫苗有效,先抛股票,今日官宣94.5%结果的Moderna高管早有信心
  4. 为什么说多道程序概念得到了中断和通道技术的支持?
  5. spring配置c3p0连接池、spring的声明式事务管理
  6. linux下安装jdk,非常简单的操作
  7. sqlite3 编译问题
  8. 上万规模数据湖如何在实验室测试
  9. 如何格式化电脑_计算机格式化的方法教程
  10. Qt实践录:常见控件操作示例2
  11. 政府安全资讯精选 2017年第十八期 工信部近三年将466个“问题APP”纳入黑名单;阿里云成为全球唯一完成德国C5云安全基础附加标准审计云服务商...
  12. [Windows]win10时间同步错误的解决方法
  13. Python沪深300成分股价值分析
  14. Python3抓取猫眼电影排行
  15. postman全方位讲解(有空看下)
  16. 百度信誉保障服务架构全解析
  17. 华为云免费试用_如何试用华为云服务器
  18. 卷积神经网络学习路线(二十一) | 旷世科技 ECCV 2018 ShuffleNet V2
  19. Android开发者上手宝典(三)
  20. java判断txt文件的编码格式

热门文章

  1. 程序运行慢?你怕是写的假 Python
  2. 从传感器到算法原理,机器人、视觉避障尽在此文
  3. 基于多阈值注意U-Net(MTAU)的MRI多模态脑肿瘤分割模型
  4. 基于OpenCV的实时停车地点查找
  5. 第3章 View的事件体系
  6. 基于用户画像 《列变行》 特征打标显示
  7. Oracle中的系统权限管理
  8. linux中实现pxe的自动安装
  9. SqlServer按照指定顺序对字段进行排序
  10. 对大龄程序员的五大误解