【状压DP】十二桥问题(nowcoder 1104-B)
正题
nowcoder 1104-B
题目大意
给你一个无向图,问你从1开始经过若干必要边,然后回到1的最短路径
解题思路
因为关键边较少,先从每个关键点跑一遍dij,得出最短距离
设fs,if_{s,i}fs,i表示必要边的状态为s,当前在第i个关键点的最短距离,然后直接转移
code
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 50010
#define M 200021
#define mp make_pair
#define fs first
#define sn second
using namespace std;
ll n,m,k,x,y,z,w,tot,ans,p[N],b[N],h[N],q[30],to[30][30],f[50000][30];
priority_queue<pair<ll,ll> >d;
struct rec
{ll l,to,nx;
}e[M<<1];
struct node
{node(ll xx=0,ll yy=0,ll zz=0){x=xx,y=yy,z=zz;}ll x,y,z;
}a[30];
void add(ll x,ll y,ll z)
{e[++tot].to=y;e[tot].l=z;e[tot].nx=h[x];h[x]=tot;return;
}
void dij(ll x)
{memset(b,127/3,sizeof(b));memset(p,0,sizeof(p));b[x]=0;d.push(mp(0,x));while(!d.empty()){ll u=d.top().sn;d.pop();if(p[u])continue;p[u]=1;for(ll i=h[u];i;i=e[i].nx){ll v=e[i].to;if(b[u]+e[i].l<b[v]){b[v]=b[u]+e[i].l;d.push(mp(-b[v],v));}}}return;
}
int main()
{scanf("%lld%lld%lld",&n,&m,&k);for(ll i=1;i<=m;++i){scanf("%lld%lld%lld",&x,&y,&z);if(i<=k){a[i]=node(x,y,z);q[++w]=x;q[++w]=y;}add(x,y,z);add(y,x,z);}q[++w]=1;sort(q+1,q+1+w);w=unique(q+1,q+1+w)-q-1;for(ll i=1;i<=w;++i){dij(q[i]);//跑最短路for(ll j=1;j<=w;++j)to[i][j]=b[q[j]];}for(ll i=1;i<=k;++i){a[i].x=lower_bound(q+1,q+1+w,a[i].x)-q;a[i].y=lower_bound(q+1,q+1+w,a[i].y)-q;}memset(f,127/3,sizeof(f));f[0][1]=0;for(ll s=0;s<(1<<k)-1;++s)for(ll i=1;i<=k;++i)if(!(s&(1<<i-1)))for(ll j=1;j<=w;++j){f[s|(1<<i-1)][a[i].x]=min(f[s|(1<<i-1)][a[i].x],f[s][j]+min(to[j][a[i].y]+a[i].z,to[j][a[i].x]+a[i].z+to[a[i].y][a[i].x]));//有两种走的方法f[s|(1<<i-1)][a[i].y]=min(f[s|(1<<i-1)][a[i].y],f[s][j]+min(to[j][a[i].x]+a[i].z,to[j][a[i].y]+a[i].z+to[a[i].x][a[i].y]));}ans=1e15;for(ll i=1;i<=w;++i)ans=min(ans,f[(1<<k)-1][i]+to[i][1]);printf("%lld",ans);return 0;
}
【状压DP】十二桥问题(nowcoder 1104-B)相关推荐
- 状压dp之二之三 炮兵阵地/玉米田 By cellur925
一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...
- AcWing 327. 玉米田(棋盘式状压dp 十字形)
本题与上一题AcWing 1064. 小国王(棋盘式状压dp)几乎一致,只不过上一题是"井字形的约束摆放",而本题是"十字形的约束摆放",即:当前位置上下左右 ...
- 糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc
糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) xzc 2019/4/5 试题 I: 糖果 时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分 [问题描述] ...
- [蓝桥杯][2019年第十届真题]糖果(状压dp)
题目描述 糖果店的老板一共有 M 种口味的糖果出售.为了方便描述,我们将 M 种 口味编号 1 ∼ M. 小明希望能品尝到所有口味的糖果.遗憾的是老板并不单独出售糖果,而 是 K 颗一包整包出售. 幸 ...
- UVa 11825 (状压DP) Hackers' Crackdown
这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...
- POJ 1321 棋盘问题(DFS 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...
- BZOJ 2073: [POI2004]PRZ( 状压dp )
早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...
- AtCoder AGC035D Add and Remove (状压DP)
题目链接 https://atcoder.jp/contests/agc035/tasks/agc035_d 题解 想了两小时憋出来一个状压DP,发现人家怎么空间才十几MB,原来暴力就行了... 考虑 ...
- CH0103最短Hamilton路径 poj2288 Islands and Brigdes【状压DP】
虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位 \((n >> ...
- 最短Hamilton路径(状压dp)
链接:https://ac.nowcoder.com/acm/problem/50909 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
最新文章
- python format 格式化字符串
- python跟易语言那个写辅助_易语言写练练看辅助
- 深度学习框架 通道顺序
- 解决MySQL数据库作古掉以及谢绝任事的办法
- pythonlist基本操作_Python 列表(list)简介及基本操作
- (5) nginx:location
- QEvent的accept()和ignore()函数功能
- Mac OS X 下 TAR.GZ 方式安装 MySQL
- c++各类型有效范围
- 【 HDU - 5363】Key Set(水题,快速幂,组合数学)
- python selenium自动化测试面试题_selenium 自动化测试面试题及答案
- LeetCode 72. 编辑距离(DP)
- node ajax validator,使用validator.js对字符串数据进行验证
- 海报设计素材|中国风的插画设计,国画浓抹中国色彩
- spring3: 依赖和依赖注入-xml配置-DI的配置
- python3.7.4安装chrome_Python3.7安装chrome驱动方法
- XTU,C语言,字母圣诞树
- pyqt 鼠标离开按钮_小米 Smart Pad 体验:表面它是个鼠标垫,其实还是个鼠标垫...
- 一个牛人的经历---北京八年——从极度贫困到财务自由
- Qt-Arm交叉编译以及调用虚拟键盘(中英)
热门文章
- c++ eos智能合约开发_[EOS智能合约]第二节:用EOS开发一个To-do List小应用
- 如何区分netty是udp还是tcp_鲜奶粉还是大包粉,到底该如何区分?
- 机器学习之无监督学习——聚类
- 算法题目——生成括号匹配
- leetcode279. 完全平方数
- linux sed 写文件,使用sed对文件进行操作
- all()与any()
- 进程间通信的方式总结
- python 学习中遇到的问题(持续更新中)
- 2018 ICPC Asia Jakarta Regional Contest J. Future Generation 状压dp