题目


分析

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

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

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


代码

#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. Qt开发技术:QCharts(二)QCharts折线图介绍、Demo以及代码详解

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  2. 【Python OO其一】构造函数__init__()

    Python对象包括三个部分:id(identity识别码).type(对象类型).value(对象的值) __ init __()构造函数 __ init __()方法应用定义构造函数,作用是在实例 ...

  3. 为Study.BlazorOne引入Study.Trade模块

    # 1.在Application项目中添加Trade的对应的包 默认的源多半是nuget.org 我们自己的模块,一般在我们自己的NuGet服务器 从"已安装"切换到"浏 ...

  4. 私有网盘服务 dzzoffice部署

    官网地址: https://dzzoffice.com/ dzzoffice有多种部署方式, docker方式,源码方式, 经过测试,这两种部署方式在数据进行备份恢复时都会存在一些bug, 所有这里采 ...

  5. Hello 2024C. Grouping Increases(贪心)

    我们只需要记录每个数结尾的数是多少(有点最长上升子序列的味道) 这种子序列的题目很多都是这样的,因为不需要连续很多时候我们只记录最后一个元素是多少. \(记s为较大子序列结尾当前的数,t为较小子序列结 ...

  6. Linux安装Nginx详细教程

    一.下载Nginx安装包 Nginx官网下载地址 根据需求选择自己需要的版本下载后上传至服务器(路径自行决定). 如果服务器有外网,可以直接在服务器上下载. wget -c https://nginx ...

  7. manjaroLinux-xfce4设置显示桌面快捷键

    1.打开窗口快捷键 2.寻找显示桌面 3.设置快捷键 啊!简单的我都不想写了,这不是为让像以前的"我"--小白,食用性更好一点吗?

  8. 安装debian后,发现进入不了root

    回想了一下,自己安装的时候,没有设置root密码! 解决方法: sudo passwd root 随后设置密码: 再次su 就可以进入root目录了!

  9. 二进制文件分析工具-hexdump使用指南

    一 概念: hexdump是Linux下的一个二进制文件查看工具,它可以将二进制文件转换为ASCII.八进制.十进制.十六进制 格式进行 查看. 二 用法简介: 该工具的用法十分简单,具体如下所示: ...

  10. Web安全前端基础

    Web安全前端基础 1.Web前端介绍 2.前端代码语言简单学习 一.Web前端介绍 web前端就是前端网络编程,也被认为是用户端编程,是为了网页或者网页应用,而编写HTML,CSS以及JS代码,所以 ...