正题

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. 2021年大数据常用语言Scala(五):基础语法学习 字符串
  2. byte转文件流 下载到本地
  3. java中怎样判断余数为3,Java的基础语法(三): 运算符
  4. 什么样的NLP库,可以支持53种语言?
  5. 某厂商APT防御思路
  6. 易创课堂成都站给你寄来一包干货,请注意查收
  7. Qt 6的Qt 3D会是什么样?
  8. 从Java到Go面向对象--继承思想.md
  9. jsp工程防止外部注入_XPATH注入详解|OWASP Top 10安全风险实践(五)
  10. linux禁用IPv6地址
  11. 由IDC机房测试谈主动工作教学实战案例!
  12. 概率论笔记:随机数、概率分布(正态分布)、中心极限定理(大数定理)
  13. 去除android控件滑动的时候出现的阴影
  14. ShortcutMapper 是应用程序的键盘快捷键
  15. ionic android n权限,ionic权限问题
  16. css的div纵向居中
  17. 企业拼团APP商城开发流程6步曲
  18. 典型相关分析、对应分析
  19. 封装基于zlib的minizip库用于解压缩zip文件
  20. break+continu作用

热门文章

  1. php按时间分组的sql语句,(SQL语句)按指定时间段分组统计
  2. linux tomcat8 启动慢,Linux系统下Tomcat8启动速度很慢的解决方法
  3. python游戏代码运行不了_无法使我的tic tac toe游戏在python中正确运行
  4. html绑定按键图片移动,如何使用JS实现用键盘控制图片移动呢?
  5. c程序设计语言选修难吗,欢迎大家选修C语言程序设计这门课,本帖解释一下一些常见的问题...
  6. leetcode347. 前 K 个高频元素
  7. [蓝桥杯2017初赛]跳蚱蜢-map标记+bfs+环形数组
  8. C++string容器-插入和删除
  9. oracle 启动实例配置,centOS 7配置单实例oracle自启动
  10. h5应用 vue 钉钉_uniapp开发一个小视频应用(一)