正题

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)相关推荐

  1. 状压dp之二之三 炮兵阵地/玉米田 By cellur925

    一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...

  2. AcWing 327. 玉米田(棋盘式状压dp 十字形)

    本题与上一题AcWing 1064. 小国王(棋盘式状压dp)几乎一致,只不过上一题是"井字形的约束摆放",而本题是"十字形的约束摆放",即:当前位置上下左右 ...

  3. 糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) Apare_xzc

    糖果(2019第十届蓝桥杯省赛C++A组I题) 解题报告(状压dp) xzc 2019/4/5 试题 I: 糖果 时间限制: 1.0s 内存限制: 256.0MB 本题总分:25分 [问题描述]    ...

  4. [蓝桥杯][2019年第十届真题]糖果(状压dp)

    题目描述 糖果店的老板一共有 M 种口味的糖果出售.为了方便描述,我们将 M 种 口味编号 1 ∼ M. 小明希望能品尝到所有口味的糖果.遗憾的是老板并不单独出售糖果,而 是 K 颗一包整包出售. 幸 ...

  5. UVa 11825 (状压DP) Hackers' Crackdown

    这是我做状压DP的第一道题,状压里面都是用位运算来完成的,只要耐下心来弄明白每次位运算的含义,还是容易理解的. 题意: 有编号为0~n-1的n台服务器,每台都运行着n中服务,每台服务器还和若干台其他服 ...

  6. POJ 1321 棋盘问题(DFS 状压DP)

    用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...

  7. BZOJ 2073: [POI2004]PRZ( 状压dp )

    早上这道题没调完就去玩NOI网络同步赛了.... 状压dp , dp( s ) 表示 s 状态下所用的最短时间 , 转移就直接暴力枚举子集 . 可以先预处理出每个状态下的重量和时间的信息 . 复杂度是 ...

  8. AtCoder AGC035D Add and Remove (状压DP)

    题目链接 https://atcoder.jp/contests/agc035/tasks/agc035_d 题解 想了两小时憋出来一个状压DP,发现人家怎么空间才十几MB,原来暴力就行了... 考虑 ...

  9. CH0103最短Hamilton路径 poj2288 Islands and Brigdes【状压DP】

    虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位                                                    \((n >> ...

  10. 最短Hamilton路径(状压dp)

    链接:https://ac.nowcoder.com/acm/problem/50909 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

最新文章

  1. python format 格式化字符串
  2. python跟易语言那个写辅助_易语言写练练看辅助
  3. 深度学习框架 通道顺序
  4. 解决MySQL数据库作古掉以及谢绝任事的办法
  5. pythonlist基本操作_Python 列表(list)简介及基本操作
  6. (5) nginx:location
  7. QEvent的accept()和ignore()函数功能
  8. Mac OS X 下 TAR.GZ 方式安装 MySQL
  9. c++各类型有效范围
  10. 【 HDU - 5363】Key Set(水题,快速幂,组合数学)
  11. python selenium自动化测试面试题_selenium 自动化测试面试题及答案
  12. LeetCode 72. 编辑距离(DP)
  13. node ajax validator,使用validator.js对字符串数据进行验证
  14. 海报设计素材|中国风的插画设计,国画浓抹中国色彩
  15. spring3: 依赖和依赖注入-xml配置-DI的配置
  16. python3.7.4安装chrome_Python3.7安装chrome驱动方法
  17. XTU,C语言,字母圣诞树
  18. pyqt 鼠标离开按钮_小米 Smart Pad 体验:表面它是个鼠标垫,其实还是个鼠标垫...
  19. 一个牛人的经历---北京八年——从极度贫困到财务自由
  20. Qt-Arm交叉编译以及调用虚拟键盘(中英)

热门文章

  1. c++ eos智能合约开发_[EOS智能合约]第二节:用EOS开发一个To-do List小应用
  2. 如何区分netty是udp还是tcp_鲜奶粉还是大包粉,到底该如何区分?
  3. 机器学习之无监督学习——聚类
  4. 算法题目——生成括号匹配
  5. leetcode279. 完全平方数
  6. linux sed 写文件,使用sed对文件进行操作
  7. all()与any()
  8. 进程间通信的方式总结
  9. python 学习中遇到的问题(持续更新中)
  10. 2018 ICPC Asia Jakarta Regional Contest J. Future Generation 状压dp