Foodie / 吃货 JYY

题目链接:jzoj 3290 / luogu P6085

题目大意

有 n 个点,有一些路径一定要走,有一些路径可以走可以不走,都有走的费用。
路径双向,然后问你从 1 号点出发经过所有点再回到 1,所需要的最小费用。

思路

虽然之前做过,但我发现重新写一次(模拟赛碰到)却不太记得了。
——>之前<——
这一次就不讲做法了,主要是讲讲思路。

首先不难看出是要找一个欧拉回路,欧拉回路有一个特点就是每个点的度数都是偶数,而我们就根据这个来 DP。

然后搞三进制的 fif_ifi​。
主要是你 DP 求出来的 fif_ifi​ 不直接是答案,你需要通过再 DP 一个二进制的 gig_igi​。
对于每个 fif_ifi​,再判断必连的连了之后,找到要让它全部是偶的需要对上的 gjg_jgj​,然后两个加在一起,取最小的那个才是答案。

代码

#include<cstdio>
#include<vector>
#include<cstring>
#define mi313 15943223using namespace std;struct node {int to, nxt;
}e[201];
int n, k, m, x, y, z, mi3[14];
int dis[14][14], ans, sum, le[14], KK;
int f[2000001], num[14], g[10001];void add(int x, int y) {e[++KK] = (node){y, le[x]}; le[x] = KK;e[++KK] = (node){x, le[y]}; le[y] = KK;
}int main() {mi3[0] = 1;for (int i = 1; i <= 13; i++)mi3[i] = mi3[i - 1] * 3;for (int i = 0; i <= 13; i++)for (int j = 0; j <= 13; j++)dis[i][j] = 1e9;ans = 1e9;scanf("%d %d", &n, &k);for (int i = 1; i <= k; i++) {scanf("%d %d %d", &x, &y, &z);x--; y--;sum += z;add(x, y);num[x]++; num[y]++;dis[x][y] = min(dis[x][y], z);dis[y][x] = min(dis[y][x], z);}scanf("%d", &m);for (int j = 1; j <= m; j++) {scanf("%d %d %d", &x, &y, &z);x--; y--;dis[x][y] = min(dis[x][y], z);dis[y][x] = min(dis[y][x], z);}//Floyedfor (int i = 0; i < n; i++) dis[i][i] = 0;for (int k = 0; k < n; k++)for (int i = 0; i < n; i++)for (int j = 0; j < n; j++)dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);//求 gfor (int i = 0; i < (1 << n); i++)g[i] = 1e9;g[0] = 0;for (int now = 0; now < (1 << n); now++) {for (int i = 0; i < n; i++)if (!((now >> i) & 1))for (int j = i + 1; j < n; j++)if (!((now >> j) & 1))g[now | (1 << i) | (1 << j)] = min(g[now | (1 << i) | (1 << j)], g[now] + dis[i][j]);}//求 ffor (int i = 0; i < mi3[n]; i++)f[i] = 1e9;f[2] = 0;for (int now = 2; now < mi3[n]; now++)if (f[now] != 1e9) {for (int i = 0; i < n; i++)if (now / mi3[i] % 3 == 0) {for (int j = le[i]; j; j = e[j].nxt)if (now / mi3[e[j].to] % 3) {//一定要选int to = now + 2 * mi3[i];f[to] = min(f[to], f[now]);}for (int j = 0; j < n; j++)if (now / mi3[j] % 3) {//可以选可以不选int to = now + mi3[i];if (now / mi3[j] % 3 == 1) to += mi3[j];else to -= mi3[j];f[to] = min(f[to], f[now] + dis[i][j]);}}}for (int now = 0; now < mi3[n]; now++) {//枚举作为答案的 fbool can = 1;for (int i = 0; i < n; i++)//判断一定要选的点有没有选if (num[i] && now / mi3[i] % 3 == 0) {can = 0;break;}if (can) {int newn = now;for (int i = 0; i < n; i++)if (num[i] & 1) {//一定要选的度数是奇数,使得你总的度数奇偶性变化if (newn / mi3[i] % 3 == 1) newn += mi3[i];else if (newn / mi3[i] % 3 == 2) newn -= mi3[i];}int to = 0;for (int i = 0; i < n; i++)//然后看把所有奇的变成偶的要的 gif (newn / mi3[i] % 3 == 1)to |= (1 << i);ans = min(ans, f[now] + g[to]);}}printf("%d", ans + sum);return 0;
}

【jzoj 3290】【luogu P6085】Foodie / 吃货 JYY(数位DP)(欧拉回路)相关推荐

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

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

  2. 吃货 JYY / Foodie

    吃货 JYY / Foodie⁡\operatorname{吃货\ JYY\ /\ Foodie}吃货 JYY / Foodie 题目链接:luogu P6085⁡\operatorname{luog ...

  3. 吃货JYY[JSOI2013][状压][欧拉回路]

    文章目录 题目 思路 代码 题目 nnn 个点 mmm 条边无向连通图,每条边有权值,指定 KKK 条边必须选,每条边可以经过多次,问从 111 出发遍历完必须边最后回到 111 的最小花费? n≤1 ...

  4. bzoj4479: [Jsoi2013]吃货jyy 欧拉回路+状态压缩Dp

    bzoj4479: [Jsoi2013]吃货jyy Description [故事背景] 作为JSOI的著名吃货,JYY的理想之一就是吃遍全世界的美食.要走遍全 世界当然需要不断的坐飞机了.而不同的航 ...

  5. 【状压DP】吃货JYY(luogu 6085)

    正题 luogu 6085 题目大意 给你一个无向图,其中有一些边是必须走的,问你从1开始走,经过所有必须走的边,然后回到1的最短路径 解题思路 n很小,可以先用Floyd跑出两个点之间的最短路 然后 ...

  6. 【JZOJ B组】【JSOI2013】吃货JYY

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

  7. [欧拉回路][状压dp] Jzoj P3290 吃货JYY

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

  8. BZOJ4479 [JSOI2013] 吃货jyy 解题报告(三进制状态压缩+欧拉回路)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4479 Description [故事背景] 作为JSOI的著名吃货,JYY的理想之一就是 ...

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

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

最新文章

  1. PHP设计模式 外观模式(Facade)
  2. java 判断网络类型_Android 网络类型判断(2g、3g、wifi)及IP地址获取
  3. python模块学习(四)
  4. Ubuntu安装FTP 服务, 实现和Windows的文件互传
  5. WX公众号授权登录的简单应用
  6. [转] log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析
  7. linux svn 撤销del,svn delete-删除文件和目录的实例
  8. hibernate_day03_多对多关联映射
  9. 方立勋_30天掌握JavaWeb_数据库表设计
  10. 华为鸿蒙系统封闭,谷歌正式“除名”华为!“亲儿子”荣耀表示:暂不考虑,鸿蒙OS处境尴尬...
  11. CAN笔记(19) 网络管理
  12. Git仓库只拷贝代码-不拷贝提交记录-不拷贝其他分支
  13. geitee仓库项目拉到(克隆到)本地
  14. SpriteKit在iOS8和OSX10.10中的新特性(强悍来袭)
  15. JAVA编写猜拳游戏
  16. 银行票据+票据池相关的项目讲解
  17. 编写一个计算图形面积和周长的程序
  18. tf卡可以自己裁剪成nm卡_手头这多卡—到底哪款TF卡才值得购买?
  19. 该知道的都知道 不知道的慢慢了解 MySQL数据库操作
  20. arm版红帽企业linux,红帽:ARM架构下的Linux不是玩笑

热门文章

  1. Oracle中connet by和level用法
  2. linux vi etc fstab,vi /etc/fstab开机挂载及使用教程分享-学派吧
  3. 微信好友互删服务器还会有记录吗,微信好友互删后还能恢复吗?一招轻松搞定...
  4. 电容式触摸芯片在电容式触摸按键中的应用
  5. 如果炒股特厉害,可是没本金,那么怎么找人投资呢?
  6. 怎样在M1 Mac上运行iOS应用?
  7. 计算机毕业设计Java“小世界”私人空间(源码+系统+mysql数据库+lw文档)
  8. 办公必备的大数据分析利器,数据分析工具推荐
  9. 设置滚动条样式vue + div + el-table
  10. 淘宝api接口一键式获得商品详情详细教程,接口聚全