#欧拉回路,状压dp,Floyd#洛谷 6085 [JSOI2013]吃货 JYY
分析
先用Floyd求出两点间的最短距离,包含必经边的欧拉回路,
先考虑欧拉回路的性质就是度数为偶数且连通,那如果有偶数个奇点可以两两配对。
设 \(g[S]\) 表示选择 \(S\) 中的点作为奇点时最少需要的代价,则 \(g[S|2^j|2^k]=\min\{g[i]+dis[j][k]\}\)
然后考虑怎样连起来,设 \(f[S]\) 表示状态为 \(S\) 的最小代价,三进制位的0表示没有与1连通,1表示连通且度数为奇数,2表示连通且度数为偶数。
这个状态度数并不包含必经边,直接枚举必经边的端点和连通的点转移一下,最后再将必经边的度数合起来,时间复杂度 \(O(3^nn^2)\)
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#include <queue>
using namespace std;
const int N=16;
struct node{int y,w,next;}e[N*10]; queue<int>q; int f[1600001],g[9001];
int n,m,ans=0x3f3f3f3f,dis[N][N],et=1,as[N],a[N],_2[N],_3[N],deg[N];
int iut(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void add(int x,int y,int w){
e[++et]=(node){y,w,as[x]},as[x]=et;
e[++et]=(node){x,w,as[y]},as[y]=et;;
}
int min(int a,int b){return a<b?a:b;}
void doit(){
q.push(2);
while (!q.empty()){
int x=q.front(),tot=0; q.pop();
for (int i=0;i<n;++i)
if ((x/_3[i])%3) a[++tot]=i;
for (int i=0;i<n;++i)
if ((x/_3[i])%3==0){
for (int j=as[i+1];j;j=e[j].next)
if ((x/_3[e[j].y-1])%3){
int y=x+_3[i]*2;
if (f[y]<=f[x]) continue;
if (f[y]==0x3f3f3f3f) q.push(y);
f[y]=f[x];
}
for (int j=1;j<=tot;++j){
int y=x+_3[i];
if ((x/_3[a[j]])%3==1) y+=_3[a[j]];
else y-=_3[a[j]];
if (f[x]+dis[i+1][a[j]+1]>=f[y]) continue;
if (f[y]==0x3f3f3f3f) q.push(y);
f[y]=f[x]+dis[i+1][a[j]+1];
}
}
}
}
int main(){
n=iut(),_2[0]=_3[0]=1;
memset(dis,0x3f,sizeof(dis));
memset(g,0x3f,sizeof(g)),g[0]=0;
memset(f,0x3f,sizeof(f)),f[2]=0;
for (int i=1;i<=n;++i) _2[i]=_2[i-1]*2,_3[i]=_3[i-1]*3;
for (int T=iut();T;--T){
int x=iut(),y=iut(),w=iut();
dis[x][y]=dis[y][x]=w;
++deg[x],++deg[y],add(x,y,w);
}
for (int T=iut();T;--T){
int x=iut(),y=iut(),w=iut();
dis[x][y]=dis[y][x]=min(dis[x][y],w);
}
for (int k=1;k<=n;++k)
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
for (int i=0;i<_2[n];++i)
for (int j=0;j<n;++j) if (!((i>>j)&1))
for (int k=j+1;k<n;++k) if (!((i>>k)&1))
g[i|_2[j]|_2[k]]=min(g[i|_2[j]|_2[k]],g[i]+dis[j+1][k+1]);
doit();
for (int S=0;S<_3[n];++S){
bool flag=0;
for (int i=0;i<n;++i)
if (as[i+1]&&(S/_3[i])%3==0){
flag=1; break;
}
if (flag) continue;
int now=S;
for (int i=0;i<n;++i) if (deg[i+1]&1)
now+=((S/_3[i])%3==1)?_3[i]:-_3[i];
int _S=0;
for (int i=0;i<n;++i)
if ((now/_3[i])%3==1)
_S|=_2[i];
ans=min(ans,f[S]+g[_S]);
}
for (int i=2;i<=et;i+=2) ans+=e[i].w;
return !printf("%d",ans);
}
#欧拉回路,状压dp,Floyd#洛谷 6085 [JSOI2013]吃货 JYY的更多相关文章
- 最短路+状压DP【洛谷P3489】 [POI2009]WIE-Hexer
P3489 [POI2009]WIE-Hexer 大陆上有n个村庄,m条双向道路,p种怪物,k个铁匠,每个铁匠会居住在一个村庄里,你到了那个村庄后可以让他给你打造剑,每个铁匠打造的剑都可以对付一些特定 ...
- 状压DP 【洛谷P3694】 邦邦的大合唱站队
[洛谷P3694] 邦邦的大合唱站队 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...
- 状压DP【洛谷P1879】 [USACO06NOV]玉米田Corn Fields
P1879 [USACO06NOV]玉米田Corn Fields 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形 ...
- 状压DP【洛谷P1896】 [SCOI2005]互不侵犯
P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子 ...
- 【状压DP】SCOI2005-洛谷P1896-互不侵犯 (状压例题)
[状压DP]SCOI2005-洛谷P1896-互不侵犯 (状压例题) 标签(空格分隔): 状压DP 好久没写博客了,真的爽(误) 题目: 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方 ...
- loj #6177. 「美团 CodeM 初赛 Round B」送外卖2 状压dp floyd
LINK:#6177.美团 送外卖2 一道比较传统的状压dp题目. 完成任务 需要知道自己在哪 已经完成的任务集合 自己已经接到的任务集合. 考虑这个dp记录什么 由于存在时间的限制 考虑记录最短时间 ...
- 【wikioi】2800 送外卖(状压dp+floyd)
http://www.wikioi.com/problem/2800/ 本题状压莫名其妙的tle了,(按照hzwer大神打的喂,他1000多ms,我就2000ms了?) (14.8.7更,将getnu ...
- POJ 3311 Hie with the Pie(状压DP + Floyd)
题目链接:http://poj.org/problem?id=3311 Description The Pizazz Pizzeria prides itself in delivering pizz ...
- hdu_5418_Victor and World(状压DP+Floyd)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 题意:给你n个点,和一些边,找一条路径经过全部的点,并回到起点,问最小的花费是多少, 题解:m& ...
- poj3311 状压dp+floyd
先floyd预处理一遍dis,枚举所有状态,dp[ i ] [ j ]表示 以 j 为终点的状态 i 使用最小的时间 #include<map> #include<set> ...
随机推荐
- GDI实现透明菜单位图
case WM_CONTEXTMENU: { m_hMenu = CreatePopupMenu(); g_BitMap = (HBITMAP)LoadImage(NULL, L"1.bmp ...
- 使用winsw将jar包注册成windows服务
使用winsw将jar包注册成windows服务 注:exe文件作用:使用winsw将jar包注册成windows服务(下载地址https://github.com/winsw/winsw/relea ...
- java学生管理系统(界面版)
运行截图 项目说明: 本系统界面我个人就从简设计了,本来打算使用windowbuilder插件设计的,可想到使用windowbuilder插件之后导致代码冗余,会影响到代码可读性,可能对小白不友好.虽 ...
- python部署-nginx部署带docker的https请求
使用带docker的服务器配置https需要两层web服务器 首先例如使用https://www.Se7eN_HOU.com进行首页访问,首先会先进入到主服务器里面,经过主服务器的Nginx Web服 ...
- Java Reactive Programming
Java Reactive Programming 响应式编程 在 Spring Boot 中,支持了响应式编程,带来了性能和内存使用方面的优化. 详见: Spring: Blocking vs no ...
- 【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
问题描述 如何查看App Service Java堆栈JVM相关的参数默认配置值? 问题解答 可以通过App Service的高级管理工具(kudu:)来查看JVM的相关参数,使用命令:java -X ...
- 【Azure Developer】CURL 发送Oauth2 Token请求获取到 404 Not Found 问题
问题描述 当使用 Postman 向AAD 发送如下请求时候,得到了404 Not Found的错误. "curl --location --request POST 'https://lo ...
- URLDNS链分析
一.概述 URLDNS 是ysoserial中利用链的一个名字,通常用于检测是否存在Java反序列化漏洞.该利用链具有如下特点: 不限制jdk版本,使用Java内置类,对第三方依赖没有要求 目标无回显 ...
- Idea编译/运行Java程序慢
修改前: 修改后: 参考: https://www.jjput.com/archives/macbookpro14m1mavenslowcompilation 问题 JDK尽量不要换版本 class ...
- WPF之x命名空间
目录 x命名空间内容 x命名空间的Attribute x:Class x:ClassModifier x:Name x:FieldModifier x:Key x:Shared x命名空间的标记扩展 ...