题目


分析

几乎就是模板题,考虑不同点就是它是点权,

所以在求两个子集的时候要减去这个点的点权,

还有一点恶心的就是要输出方案,令人作呕


代码

#include <cstdio>
#include <cctype>
#include <queue>
#include <cstring>
#define rr register
using namespace std;
const int N=101,M=1051; queue<int>q;
struct node{int y,w,next;}e[M<<2]; pair<int,int>pre[M][N];
int dp[M][N],v[N],two[11],p[N],as[N],a[N],n,m,al,k=1,tot;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed rk(int x,int y){return (x-1)*m+y;}
inline void add(int x,int y,int w){e[++k]=(node){y,w,as[x]},as[x]=k;}
inline void Spfa(int z){
while (q.size()){
rr int x=q.front(); q.pop();
for (rr int i=as[x];i;i=e[i].next)
if (dp[z][e[i].y]>dp[z][x]+e[i].w){
dp[z][e[i].y]=dp[z][x]+e[i].w;
pre[z][e[i].y]=make_pair(z,x);
if (!v[e[i].y]) v[e[i].y]=1,q.push(e[i].y);
}
v[x]=0;
}
}
inline void dfs(int S,int now){
if (!pre[S][now].first) return;
v[now]=1;
if (pre[S][now].second==now)
dfs(pre[S][now].first^S,now);
dfs(pre[S][now].first,pre[S][now].second);
}
signed main(){
memset(dp,0x3f,sizeof(dp));
n=iut(),m=iut(),tot=n*m,two[0]=1;
for (rr int i=1;i<11;++i) two[i]=two[i-1]<<1;
for (rr int i=1;i<=n;++i)
for (rr int j=1,RK;j<=m;++j){
RK=rk(i,j),a[RK]=iut();
if (!a[RK]) p[al++]=RK;
if (j>1) add(RK,rk(i,j-1),a[rk(i,j-1)]),add(rk(i,j-1),RK,a[RK]);
if (i>1) add(RK,rk(i-1,j),a[rk(i-1,j)]),add(rk(i-1,j),RK,a[RK]);
}
for (rr int i=0;i<al;++i) dp[two[i]][p[i]]=0;
for (rr int S=0;S<two[al];++S){
memset(v,0,sizeof(v));
for (rr int i=1;i<=tot;++i){
for (rr int j=S&(S-1);j;j=(j-1)&S)
if (dp[S][i]>dp[j][i]+dp[S^j][i]-a[i]){
dp[S][i]=dp[j][i]+dp[S^j][i]-a[i];
pre[S][i]=make_pair(j,i);
}
if (dp[S][i]^dp[0][0]) q.push(i),v[i]=1;
}
Spfa(S);
}
printf("%d",dp[two[al]-1][p[0]]);
dfs(two[al]-1,p[0]);
for (rr int i=1,tot=0;i<=n;++i){
putchar(10);
for (rr int j=1;j<=m;++j)
if (rk(i,j)==p[tot]) ++tot,putchar('x');
else if (v[rk(i,j)]) putchar('o');
else putchar('_');
}
return 0;
}

#斯坦纳树#洛谷 4294 [WC2008]游览计划的更多相关文章

  1. 洛谷4294 [WC2008]游览计划——斯坦纳树

    题目:https://www.luogu.org/problemnew/show/P4294 大概是状压.两种转移,一个是以同一个点为中心,S由自己的子集拼起来:一个是S相同.中心不同的同层转移. 注 ...

  2. 洛谷 P4294 [WC2008]游览计划

    题目链接 不是很会呢,但似乎抄了题解后有点明白了 sol:状态DP显然,其实是要构建一棵最小生成树一样的东西,我自己的理解(可能不是很对哦希望多多指教)f[x][y][zt]就是到x,y这个点,状态为 ...

  3. Luogu 4294 [WC2008]游览计划 | 斯坦纳树

    题目链接 Luogu 4294 (我做这道题的时候BZOJ全站的SPJ都炸了 提交秒WA 幸好有洛谷) 题解 这道题是[斯坦纳树]的经典例题.斯坦纳树是这样一类问题:带边权无向图上有几个(一般约10个 ...

  4. 【BZOJ2595_洛谷4294】[WC2008]游览计划(斯坦纳树_状压DP)

    上个月写的题qwq--突然想写篇博客 题目: 洛谷4294 分析: 斯坦纳树模板题. 简单来说,斯坦纳树问题就是给定一张有边权(或点权)的无向图,要求选若干条边使图中一些选定的点连通(可以经过其他点) ...

  5. BZOJ_2595_[Wc2008]游览计划_斯坦纳树

    BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...

  6. 【BZOJ2595】[Wc2008]游览计划 斯坦纳树

    [BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...

  7. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 7 ...

  8. BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*

    BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...

  9. [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树

    游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...

  10. 洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)

    洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问.显然一个连通块符合条件当且仅当它能够包含所有 ...

随机推荐

  1. vscode自定义运行和调试创建launch.json文件及项目独立配置文件

    1.创建lauch.json文件 2.然后在项目目录中会自动创建.vscode的目录 3.在.vscode目录下创建settings.json项目独立配置文件 4.在settings.json中写入 ...

  2. linux下docker安装与初始

    1 docker的安装与使用初识 1 docker的安装 # step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persi ...

  3. Kotlin 基础入门

    目录 一.基础语法 1.1 常见数据类型 1.2 变量 1.2.1 变量声明 1.2.2 类型推断 1.2.3 Null 安全 1.2.4 面向对象语言 1.3 流程控制 1.3.1 if 表达式 1 ...

  4. Python3中的“联动”现象

    技术背景 在python中定义一个列表时,我们一定要注意其中的可变对象的原理.虽然python的语法中没有指针,但是实际上定义一个列表变量时,是把变量名指到了一个可变对象上.如果此时我们定义另外一个变 ...

  5. PRINCE2系列一基于项目情境自定义解决方案

    PRINCE2(PRojects IN Controlled Environments,受控环境下的项目管理) 对项目进行了如下定义:项目是按照一个被批准的商业论证,为了交付一个或多个商业产品而创建的 ...

  6. HAProxy端口资源耗尽的解决办法

    项目背景 系统使用HAProxy为mq和部分应用的负载均衡服务.近期,瞬时流量过大,导致出现连锁反应,HA开始波动. HAProxy版本:1.6.3 问题分析 心跳检测大量失败,项目状态极不稳定.观察 ...

  7. DataGear 制作全国和省级地图联动的数据可视化看板

    DataGear看板的图表联动功能,使您可以轻松制作支持图表联动的全国地图.省级地图数据可视化看板. 首先,新建两个数据集. 第一个是各省指标数据集,将用于绘制全国指标图表,它的SQL语句如下所示: ...

  8. Java ----多线程 案例

    1 package bytezero.threadtest2; 2 3 /** 4 * 银行有一个账户 5 * 有两个储户分别向同一个账户存 3000元,每次存1000,存三次,每次存完打印账户余额 ...

  9. (广州南沙)vue知识点整理2021,主要是防止忘记防备快速翻看

         ///////////////////////////   vue 中使用路由技巧:router //////////////////////////////// 写笔记说明,之前在江门工作 ...

  10. snipaste 截屏工具快捷键 alt + A 还有 Ctrl + Shift + A

    snipaste 截屏工具快捷键 alt + A 还有 Ctrl + Shift + A 因为有时候 alt 会取消右键等菜单