题目描述

世界上一共有N个JYY愿意去的城市,分别从1编号到N。JYY选出了K个他一定要乘坐的航班。除此之外,还有M个JYY没有特别的偏好,可以乘坐也可以不乘坐的航班。
一个航班我们用一个三元组(x,y,z)来表示,意义是这趟航班连接城市x和y,并且机票费用是z。每个航班都是往返的,所以JYY花费z的钱,既可以选择从x飞往y,也可以选择从y飞往x。
南京的编号是1,现在JYY打算从南京出发,乘坐所有K个航班,并且最后回到南京,请你帮他求出最小的花费。

Input
输入数据的第一行包含两个整数N和K;
接下来K行,每行三个整数x,y,z描述必须乘坐的航班的信息,数据保证在这K个航班中,不会有两个不同的航班在同一对城市之间执飞;
第K+2行包含一个整数M;
接下来M行,每行三个整数x,y,z 描述可以乘坐也可以不乘坐的航班信息。

Output
输出一行一个整数,表示最少的花费。数据保证一定存在满足JYY要求的旅行方案。

Sample Input
6 3
1 2 1000
2 3 1000
4 5 500
2
1 4 300
3 5 300

Sample Output
3100

Data Constraint
对于10%的数据满足N≤4;
对于30%的数据满足N≤ 7;
对于额外30%的数据满足,JYY可以只通过必须乘坐的K个航班从南京出发到达任意一个城市;
对于100%的数据满足2≤N≤13,0≤K≤78,2 ≤M ≤ 200,1 ≤x,y ≤N,1 ≤z ≤ 10^4。

Hint
样例说明:一个可行的最佳方案为123541。
机票所需的费用为1000+1000+300+500+300=3100。

分析

我们发现这是一个要求从1出发经过必经边回到1的最短路径,容易想到欧拉回路
那么如何处理必经边呢?
容易想到只把必经边加入图,然后度为奇数的点连接它们之间的最短路。
于是容易想到fi,i是一个二进制状态0表示度偶1表示度奇
但是不对劲!再一看题,这可没说是整个图是连通图啊
然后变成三进制状态,0表示图外,1表示图内度奇,0表示图内度偶
然后就很简单了,配对啥的= =

#include <iostream>
#include <cstdio>
#include <queue>
#include <memory.h>
#define rep(i,a,b) for (i=a;i<=b;i++)
const int N=14;
const int M=80;
using namespace std;
int n,k,m;
struct Edge {int u,v,w,nx;
}g[2*M];
int cnt,list[N];
int b[N]={1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323},p[N]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192};
int f[4782969],bf[16384],d[N][N],iod[N];void Add(int u,int v,int w) {g[++cnt].u=u;g[cnt].v=v;g[cnt].w=w;g[cnt].nx=list[u];list[u]=cnt;
}void Floyd() {int i,j,k;rep(i,1,n)rep(j,1,n)rep(k,1,n)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}void Prepare() {int i,j,k;memset(bf,0x3f,sizeof bf);bf[0]=0;rep(i,0,(1<<n)-1)rep(j,1,n-1)if (!(i&p[j-1]))rep(k,j+1,n)if (!(i&p[k-1]))bf[i^p[j-1]^p[k-1]]=min(bf[i^p[j-1]^p[k-1]],bf[i]+d[j][k]);
}void Get_connected() {queue<int> q;int a[N];while (!q.empty()) q.pop();memset(f,0x3f,sizeof f);f[2]=0;q.push(2);while (!q.empty()) {int s=q.front();q.pop();int i,j,k=0;rep(i,1,n)if (s/b[i-1]%3) a[++k]=i;rep(i,1,n)if (!(s/b[i-1]%3)) {for (j=list[i];j;j=g[j].nx)if (s/b[g[j].v-1]%3) {int ns=s+b[i-1]*2;if (f[s]>=f[ns]) continue;if (f[ns]==1061109567) q.push(ns);f[ns]=f[s];}rep(j,1,k) {int ns=s+b[i-1];ns+=(s/b[a[j]-1]%3==1)?b[a[j]-1]:-b[a[j]-1];if (f[s]+d[i][a[j]]>=f[ns]) continue;if (f[ns]==1061109567) q.push(ns);f[ns]=f[s]+d[i][a[j]];}}}
}int Get_couple() {int s,ns,i,ans=2147483647;rep(s,0,b[n]-1) {bool a=0;rep(i,1,n)if (list[i]&&!(s/b[i-1]%3)) {a=1;break;}if (a) continue;int expect=s;rep(i,1,n)if (iod[i]&1) expect+=(s/b[i-1]%3==1)?b[i-1]:-b[i-1];ns=0;rep(i,1,n)if (expect/b[i-1]%3==1) ns^=p[i-1];ans=min(ans,f[s]+bf[ns]);}rep(i,1,cnt)if (i&1) ans+=g[i].w;return ans;
}int main() {int i;scanf("%d%d",&n,&k);memset(d,0x3f,sizeof d);rep(i,1,k) {int u,v,w;scanf("%d%d%d",&u,&v,&w);iod[u]++;iod[v]++;Add(u,v,w);Add(v,u,w);d[u][v]=d[v][u]=w;}scanf("%d",&m);rep(i,1,m) {int u,v,w;scanf("%d%d%d",&u,&v,&w);d[u][v]=d[v][u]=min(d[u][v],w);}Floyd();Prepare();Get_connected();printf("%d",Get_couple());
}

[状压DP][欧拉回路]吃货JYY相关推荐

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

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

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

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

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

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

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

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

  5. 【jzoj 3290】【luogu P6085】Foodie / 吃货 JYY(数位DP)(欧拉回路)

    Foodie / 吃货 JYY 题目链接:jzoj 3290 / luogu P6085 题目大意 有 n 个点,有一些路径一定要走,有一些路径可以走可以不走,都有走的费用. 路径双向,然后问你从 1 ...

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

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

  7. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  8. P1433 吃奶酪(状压dp)

    洛谷 / 题目列表 / 题目详情 P1433 吃奶酪 提交 23.28k 通过 9.30k 时间限制 1.00s 内存限制 125.00MB 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问 ...

  9. CSUST 2007-我爱吃烧烤(状压DP)

    题目链接:http://acm.csust.edu.cn/problem/2007 博客园食用链接:https://www.cnblogs.com/lonely-wind-/p/13395416.ht ...

最新文章

  1. Java 并发框架全览,这个牛逼!
  2. [转]系统吞吐量(TPS)、用户并发量、性能测试概念和公式---学习
  3. 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序
  4. Qt 学习之路 2(80):定位器
  5. python朋友圈评论_利用Python实现朋友圈中的九宫格图片效果
  6. SQLSERVER数据仓库的构建与分析
  7. 网站开启Gzip压缩-apache
  8. 2018C/C++蓝桥杯解析
  9. Ubuntu tomcat
  10. miui android 版本下载安装,MIUI12.2.2.0稳定版安装包
  11. 嵌入式软件工程师总结(1)
  12. 不会打字学计算机难吗,你知道你为什么学不会五笔吗 五笔难学吗
  13. 刚开始做斗音掌握这5点至少让你少走半年弯路
  14. python 处理pdf文件 转成txt 批量提取pdf中的文字
  15. 计算机网络打不开怎么办,网页无法打开,详细教您有网络但是打不开网页怎么办?...
  16. Kubernetes多运营商云服务器部署(kubeadm+ipvs+flannel)
  17. java在天猫获取图片_怎么获取天猫商品主图图片?
  18. 学会Zynq(10)lwIP简介
  19. 中国旅游研究院:2018中日韩旅游大数据报告(附下载)
  20. LaTeX系列 |3、常用LaTeX表格模版

热门文章

  1. 运营 23 年,昔日“国内第一大电商网站”黄了...
  2. curl命令java_从Java调用curl命令
  3. Java基础番外篇二(Java修饰符讲解)
  4. 吹牛皮系列之搭建专属程序员的Linux系统开发环境
  5. 全国计算机英语四六级准考证打印准考证号,大学英语四六级准考证打印入口|四六级准考证打印入口2020...
  6. 如何提升android系统,Android系统智能手机如何提升上网速度
  7. 【一本通评测 1373】【堆】【贪心】鱼塘钓鱼
  8. suse enterprise linux 10 安装及配置svn(使用svnserve)
  9. 通过HSSFWorkbook生成excel表格
  10. 小白到大白-windows炫酷技巧