题目链接

差不多是斯坦纳树裸题,不过边权化成了点权,这样在合并两棵子树时需要去掉根结点的权值,防止重复。

题目还要求输出解,只要在转移时记录下路径,然后dfs一遍就好了。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+,inf=0x3f3f3f3f;
const int dx[]= {,,-,};
const int dy[]= {-,,,};
int n,m,k,dp[<<][N][N],a[N][N],inq[N][N];
char s[N][N];
struct D {int x,y;} X[N];
struct Ans {int S,x,y;} ansS,nxt[<<][N][N];
queue<D> q;
void upd(int x,int y,int c,int S,int x2,int y2) {
if(dp[S][x][y]>c) {
dp[S][x][y]=c;
nxt[S][x][y]= {S,x2,y2};
if(!inq[x][y])inq[x][y]=,q.push({x,y});
}
}
void spfa(int S) {
while(q.size())q.pop();
memset(inq,,sizeof inq);
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j)
if(dp[S][i][j]!=inf)inq[i][j]=,q.push({i,j});
while(q.size()) {
int x=q.front().x,y=q.front().y;
q.pop(),inq[x][y]=;
for(int i=; i<; ++i) {
int x2=x+dx[i],y2=y+dy[i];
if(x2<||x2>n||y2<||y2>m)continue;
upd(x2,y2,dp[S][x][y]+a[x2][y2],S,x,y);
}
}
}
void dfs(int S,int x,int y) {
if(!a[x][y])s[x][y]='x';
else s[x][y]='o';
int S2=nxt[S][x][y].S,x2=nxt[S][x][y].x,y2=nxt[S][x][y].y;
if(!S2)return;
else if(S2==S)dfs(S2,x2,y2);
else dfs(S2,x2,y2),dfs(S^S2,x2,y2);
}
int main() {
scanf("%d%d",&n,&m);
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j) {
scanf("%d",&a[i][j]);
if(!a[i][j])X[k++]= {i,j};
}
memset(dp,inf,sizeof dp);
for(int i=; i<k; ++i)dp[<<i][X[i].x][X[i].y]=a[X[i].x][X[i].y];
for(int S=; S<(<<k); ++S) {
for(int S2=(S-)&S; S2; S2=(S2-)&S)
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j) {
dp[S][i][j]=min(dp[S][i][j],dp[S2][i][j]+dp[S^S2][i][j]-a[i][j]);
if(dp[S][i][j]==dp[S2][i][j]+dp[S^S2][i][j]-a[i][j])nxt[S][i][j]= {S2,i,j};
}
spfa(S);
}
int ans=inf;
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j) {
ans=min(ans,dp[(<<k)-][i][j]);
if(ans==dp[(<<k)-][i][j])ansS= {(<<k)-,i,j};
}
for(int i=; i<=n; ++i)
for(int j=; j<=m; ++j)s[i][j]='_';
dfs(ansS.S,ansS.x,ansS.y);
printf("%d\n",ans);
for(int i=; i<=n; ++i) {
for(int j=; j<=m; ++j)putchar(s[i][j]);
puts("");
}
return ;
}

P4294 [WC2008]游览计划 (斯坦纳树)的更多相关文章

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

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

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

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

  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. 洛谷4294 [WC2008]游览计划——斯坦纳树

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

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

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

  9. bzoj2595 / P4294 [WC2008]游览计划

    P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...

随机推荐

  1. python实用小功能

    正则匹配手机号码: regExp =r"^((13[0-9])|(15[^4])|(18[0-9])|(17[0-8])|(147)|(19[0-9]))\d{8}$"; 常用于用 ...

  2. SSDsim

    1.官网 http://storage.hust.edu.cn/SSDsim/ 2.博客 http://www.tuicool.com/articles/U77n2i http://blog.sina ...

  3. Linux下部署FastDFS

    FastDFS的安装 首先需要准备的资源如下:     libfastcommon-master:https://github.com/happyfish100/libfastcommon FastD ...

  4. Docker CE 下载方式

    1. 找到一个网址挺好的 https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/arm64/ mark 一下 以后用.

  5. sql sever 授予用户create table权限

    sql server2008的用户权限管理及其细致.此处我也不知道是表扬还是批评.所以经常会遇到各种“对不起您没有**权限”的问题. 本次遇到的问题机器常见.在尝试修改数据库结构时提示"没有 ...

  6. PB赋值粘贴

    复制:string ls_templs_temp = trim(sle_1.text)Clipboard(ls_temp) 粘贴:string ls_templs_temp = Clipboard() ...

  7. http请求之of_ordering_json

    //Public function of_ordering_json (string as_json,ref string as_jsons[]) returns integer //string a ...

  8. java 字节流与字符流的区别(转)

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...

  9. asp.net 4.Redirect重定向和文件图片上传

    1.Response.Redirect 如图所示: 1.用户点击修改按钮, 浏览器向服务器发送一个POST请求 http://localhost:6543/UpdateUser.ashx 2.服务器的 ...

  10. LeetCode 腾讯精选50题--数组中的第K个最大元素

    好吧,不得不承认,书上看到的始终不是自己的,只有亲身时间过才会明白该怎么操作. 找数组中第K个最大元素,简而言之就是先排序,不论使用哪种算法,都需要先排序,确认位置,由于数组可以通过下标直接访问,所以 ...