题目:https://www.luogu.org/problemnew/show/P4294

大概是状压。两种转移,一个是以同一个点为中心,S由自己的子集拼起来;一个是S相同、中心不同的同层转移。

注意S由自己的子集拼起来的时候要减去一倍的自己位置的代价。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
int Mn(int a,int b){return a<b?a:b;}
const int N=,M=(<<)+,K=,INF=N*(<<);
int n,m,tot,bh[K][K],x[N],y[N],w[N],dp[N][M],bin[K];
queue<int> q; bool ins[N]; int to[N][M][][];
char ch[K][K];
void cz(int k,int d,int s)
{
dp[d][s]=dp[k][s]+w[d];
to[d][s][][]=k;to[d][s][][]=s;to[d][s][][]=to[d][s][][]=;
if(!ins[d])q.push(d),ins[d]=;
}
void spfa(int s)
{
for(int i=;i<=tot;i++)
q.push(i),ins[i]=;
while(q.size())
{
int k=q.front(),d;q.pop();ins[k]=;
if(x[k]>&&dp[d=bh[x[k]-][y[k]]][s]>dp[k][s]+w[d])cz(k,d,s);
if(x[k]<n&&dp[d=bh[x[k]+][y[k]]][s]>dp[k][s]+w[d])cz(k,d,s);
if(y[k]>&&dp[d=bh[x[k]][y[k]-]][s]>dp[k][s]+w[d])cz(k,d,s);
if(y[k]<m&&dp[d=bh[x[k]][y[k]+]][s]>dp[k][s]+w[d])cz(k,d,s);
}
}
void solve(int cr,int s)
{
ch[x[cr]][y[cr]]='o';
if(to[cr][s][][])solve(to[cr][s][][],to[cr][s][][]);
if(to[cr][s][][])solve(to[cr][s][][],to[cr][s][][]);
}
int main()
{
n=rdn();m=rdn();int cnt=;bin[]=;
memset(dp,0x3f,sizeof dp);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
bh[i][j]=++tot;w[tot]=rdn();
x[tot]=i; y[tot]=j;
if(w[tot])continue; cnt++; bin[cnt]=bin[cnt-]<<;
dp[tot][bin[cnt-]]=;
}
for(int s=;s<bin[cnt];s++)
{
for(int i=;i<=tot;i++)
for(int d=(s-)&s;d;d=(d-)&s)
if(dp[i][d]+dp[i][s^d]-w[i]<dp[i][s])//-w[i]!
{
dp[i][s]=dp[i][d]+dp[i][s^d]-w[i];
to[i][s][][]=to[i][s][][]=i;
to[i][s][][]=d; to[i][s][][]=s^d;
}
spfa(s);
}
int ans=INF,cr[]={,bin[cnt]-};
for(int i=;i<=tot;i++)
if(dp[i][bin[cnt]-]<ans)ans=dp[i][bin[cnt]-],cr[]=i;
solve(cr[],cr[]);
printf("%d\n",ans);
for(int i=;i<=n;i++,puts(""))
for(int j=;j<=m;j++)
if(!w[bh[i][j]])putchar('x');
else if(ch[i][j]=='o')putchar('o');
else putchar('_');
return ;
}

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

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

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

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

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

  3. bzoj2595: [Wc2008]游览计划 斯坦纳树

    斯坦纳树是在一个图中选取某些特定点使其联通(可以选取额外的点),要求花费最小,最小生成树是斯坦纳树的一种特殊情况 我们用dp[i][j]来表示以i为根,和j状态是否和i联通,那么有 转移方程: dp[ ...

  4. BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)

    Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 2030  Solved: 986[Submit][Status][ ...

  5. BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树

    [题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...

  6. bzoj2595 [Wc2008]游览计划——斯坦纳树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2595 今天刚学了斯坦纳树,还不太会,写一道题练习一下: 参考了博客:http://www.c ...

  7. P4294 [WC2008]游览计划 (斯坦纳树)

    题目链接 差不多是斯坦纳树裸题,不过边权化成了点权,这样在合并两棵子树时需要去掉根结点的权值,防止重复. 题目还要求输出解,只要在转移时记录下路径,然后dfs一遍就好了. #include<bi ...

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

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

  9. 【BZOJ-2595】游览计划 斯坦纳树

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

随机推荐

  1. INNODB存储引擎表空间

    这片文章主要是对innodb表空间的一些说明: innodb中表空间可以分为以下几种: 系统表空间 独立表空间 undo表空间 临时表空间(temporary tablespace) 通用表空间(ge ...

  2. SQL优化之limit 1

    在某些情况下,如果明知道查询结果只有一个,SQL语句中使用LIMIT 1会提高查询效率.  例如下面的用户表(主键id,邮箱,密码): create table t_user( id int prim ...

  3. Cooperation.GTST团队第四周项目总结

    项目进展 这周我们的主要学习内容是: 1.研究学习如何导入博客详情页. 2.继续研究如何使用博客园的相关接口,导入相关jar包实现页面整体效果: 在我们使用其它APP或者上网浏览论坛.网页等时,通常都 ...

  4. [参考]用递归的方法获取 字符 对应的 二进制字符串 (C/C++)

    将字符转换为16进制字符串.十进制字符串可以参考这里:https://www.cnblogs.com/stxs/p/8846545.html 代码及调试结果 举例:字符'a',查ASCII码表它对应的 ...

  5. poj3164最小树形图模板题

    题目大意:给定一个有向图,根节点已知,求该有向图的最小树形图.最小树形图即有向图的最小生成树,定义为:选择一些边,使得根节点能够到达图中所有的节点,并使得选出的边的边权和最小. 题目算法:朱-刘算法( ...

  6. 子网掩码与ip有实际关系吗?

    子网掩码是作为ip地址的标识,还是本身就是ip地址的一部分?例如10.10.10.1/24和10.10.10.1/25是同一个ip地址吗? 作者:知乎用户链接:https://www.zhihu.co ...

  7. jxl将list导入到Excel中供下载

    jxl操作excel /** * 分隔符 */ private final static String SEPARATOR = "|"; /** * 由List导出至指定的Shee ...

  8. 第108天:Ajax中XMLHttpRequest详解

    在Ajax应用程序中,XmlHttpRequest对象负责将用户信息以异步通信地发送到服务器端,并接收服务器返回的响应信息和数据. XMLHttpRequest可以提供不重新加载页面的情况下更新网页, ...

  9. mysql中InnoDB存储引擎的行锁和表锁

    Mysql的InnoDB存储引擎支持事务,默认是行锁.因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错. ...

  10. UVA-1152 4 Values whose Sum is 0 (二分)

    题目大意:在4个都有n个元素的集合中,每个集合选出一个元素,使得4个数和为0.问有几种方案. 题目分析:二分.任选两组求和,剩下两组求和,枚举第一组中每一个和sum,在第二组和中查找-sum的个数,累 ...