[BZOJ2595]游览计划
斯坦纳树居然不是数据结构...
斯坦纳树应该是类似最小生成树的问题,只不过它允许增加额外的点
比如这道题就是找关于景点的最小生成树,但还要付出最小的代价,加一些额外的格子把景点都连起来
套路是设$f_{s,i}$表示至少选$s$这个集合的点,必经$i$的最小价值,那么转移就是$f_{s,i}\gets f_{u,i}+f_{s-u,i}-v_i(u\subset s)$和$f_{s,i}\gets f_{s,j}+w_{i,j}\left(\exists(i,j)\right)$
如果$f_{u,i}$和$f_{s-u,i}$选取的额外点有重合的部分,那么第一个转移算重了这些点的权值,所以还要加一个朴素的转移
第一个转移直接枚举子集即可,第二个转移用最短路来转移
这题应该就是斯坦纳树的裸题,要输出方案的话,记每个状态由什么转移过来,最后dfs一遍即可即可
#include<stdio.h> #include<string.h> typedef int mt[11][11]; const int go[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; bool min(int&a,int b){ if(b<a){ a=b; return 1; } return 0; } mt a,f[1024]; int n,m,head,tail; bool inq[11][11]; struct zt{ int x,y; zt(int a=0,int b=0){x=a;y=b;} }q[100010],t; struct fr{ int s,x,y; fr(int a=0,int b=0,int c=0){s=a;x=b;y=c;} bool hav(){return s|x|y;} }g[1024][11][11]; void bfs(mt&dis){ int i,x,y; while(head<=tail){ t=q[head]; head++; inq[t.x][t.y]=0; for(i=0;i<4;i++){ x=t.x+go[i][0]; y=t.y+go[i][1]; if(1<=x&&x<=n&&1<=y&&y<=m&&min(dis[x][y],dis[t.x][t.y]+a[x][y])){ g[&dis-f][x][y]=fr(&dis-f,t.x,t.y); if(!inq[x][y]){ tail++; q[tail]=zt(x,y); inq[x][y]=1; } } } } } bool v[11][11]; void dfs(int s,int i,int j){ v[i][j]=1; fr&f=g[s][i][j]; if(f.hav()){ dfs(f.s,f.x,f.y); if(f.x==i&&f.y==j)dfs(s^f.s,i,j); } } int main(){ int i,j,s,t,K,inf; scanf("%d%d",&n,&m); memset(f,63,sizeof(f)); inf=f[0][0][0]; K=0; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ scanf("%d",a[i]+j); if(a[i][j]==0){ f[1<<K][i][j]=0; K++; } } } for(s=0;s<1<<K;s++){ head=1; tail=0; memset(inq,0,sizeof(inq)); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ for(t=s;t;t=(t-1)&s){ if(min(f[s][i][j],f[t][i][j]+f[s^t][i][j]-a[i][j]))g[s][i][j]=fr(t,i,j); } if(f[s][i][j]!=inf){ tail++; q[tail]=zt(i,j); inq[i][j]=1; } } } bfs(f[s]); } for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(a[i][j]==0){ printf("%d\n",f[(1<<K)-1][i][j]); dfs((1<<K)-1,i,j); for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(a[i][j]==0) putchar('x'); else if(v[i][j]) putchar('o'); else putchar('_'); } putchar('\n'); } return 0; } } } }
[BZOJ2595]游览计划的更多相关文章
- 【BZOJ2595】 [Wc2008]游览计划
BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...
- 【BZOJ2595】[Wc2008]游览计划 斯坦纳树
[BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ...
- BZOJ2595 Wc2008 游览计划 【斯坦纳树】【状压DP】*
BZOJ2595 Wc2008 游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个 ...
- [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树
游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...
- bzoj2595 / P4294 [WC2008]游览计划
P4294 [WC2008]游览计划 斯坦纳树 斯坦纳树,是一种神奇的树.它支持在一个连通图上求包含若干个选定点的最小生成树. 前置算法:spfa+状压dp+dfs(大雾) 我们设$f[o][P]$为 ...
- 【BZOJ-2595】游览计划 斯坦纳树
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1518 Solved: 7 ...
- BZOJ_2595_[Wc2008]游览计划_斯坦纳树
BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ...
- [WC2008]游览计划 解题报告
[WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...
- 【LG4294】[WC2008]游览计划
[LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...
随机推荐
- 【CF1009F】 Dominant Indices (长链剖分+DP)
题目链接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子树中距离\(u\)为\(i\)的点的个数,则\(f[u][i]=\sum f[v][i-1]\) 长链剖 ...
- poj 1837 Balance(背包)
题目链接:http://poj.org/problem?id=1837 Balance Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- java===java基础学习(8)---静态域与静态方法
静态域:如果将域定义为static,每个类中只有一个这样的域.而每一个对象对于所有的实例域却都有自己的一份拷贝.例如,加入需要给每一个雇员赋予唯一的标识码.这里给的Employee类添加一个实例域id ...
- Tabular DataStream protocol 协议
Tabular DataStream protocol 协议 Freetds 创建过程 https://wenku.baidu.com/view/2076cbfaaef8941ea76e0576.ht ...
- 【jzoj2017.8.21提高组A】
太菜了,刷刷NOIP题玩玩. 今天的题好像以前有做过(雾) A. #include<bits/stdc++.h> typedef long long ll; ],cnt; ll x; in ...
- mysql utf8改utf8mb4
由于需要用到utf8mb4,之前是utf8现在给改成utf8mb4 查看当前环境 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' ...
- 无缝滚动Js
<html> <body> <div style="width: 190px; height: 127px; overflow: hidden; font-si ...
- Leetcode 之Longest Palindromic Substring(30)
很经典的一道题,最长回文子串,有多种方法. 首先介绍的一种方法是从中间向两边展开.注意区分aba和abba型的回文串:如果当前最长的子串已经当于两边中最长的子串了,则无需再去判断. //从中间向两边展 ...
- mysql部署后无法远程连接的原因(错误代码10061),服务监听127.0.0.1和0.0.0.0的区别
在Ubuntu上部署mysql服务并添加了一个非root用户后,发现无法远程连接, Navicat连接mysql出现2003——can't connect to mysql server on loc ...
- Go语言标准包之json编码
标准的就简单通用. package main import ( "encoding/json" "fmt" "log" ) func mai ...