斯坦纳树居然不是数据结构...

斯坦纳树应该是类似最小生成树的问题,只不过它允许增加额外的点

比如这道题就是找关于景点的最小生成树,但还要付出最小的代价,加一些额外的格子把景点都连起来

套路是设$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]游览计划的更多相关文章

  1. 【BZOJ2595】 [Wc2008]游览计划

    BZOJ2595 [Wc2008]游览计划 Solution 考虑这是一个最小费用连通性的问题,既然大家都说这是什么斯坦纳树那就是的吧... 所以我们肯定可以这样设一个dp状态: \(dp_{i,j, ...

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

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

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

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

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

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

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

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

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

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

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

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

  8. [WC2008]游览计划 解题报告

    [WC2008]游览计划 斯坦纳树板子题,其实就是状压dp 令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价 然后有转移 \[ dp_{i,S}=\min_{T\in ...

  9. 【LG4294】[WC2008]游览计划

    [LG4294][WC2008]游览计划 题面 洛谷 bzoj 题解 斯坦纳树板子题. 斯坦纳树的总结先留个坑. 代码 #include <iostream> #include <c ...

随机推荐

  1. John's trip(POJ1041+欧拉回路+打印路径)

    题目链接:http://poj.org/problem?id=1041 题目: 题意:给你n条街道,m个路口,每次输入以0 0结束,给你的u v t分别表示路口u和v由t这条街道连接,要输出从起点出发 ...

  2. ubuntu gnome桌面秀

    之前装的是ubuntu14.10gnome版的 然后一路升级成15.04,到今天的15.10 最后发现现在的gnome桌面已经非常适合我的工作了 先放一张图,这是我的桌面 原来使用ubuntu15.0 ...

  3. linux 服务简介

    Linux服务(Linux services)对于每个应用Linux的用户来说都很重要.关闭不需要的服务,可以让Linux运行的更高效,但并不是所有的Linux服务都可以关闭.今天安装了一次CentO ...

  4. github新建托管项目及上传项目

    一.新建托管项目 1.注册: 2.点击new repositories新建一个新项目: 3.输入项目名称及项目描述,Create repository: 4.点击右边栏的剪切板图标,记录下你的项目地址 ...

  5. MFC单文档框架分析及执行流程(转)

    原文转自 https://blog.csdn.net/u011619422/article/details/40402705 首先来分析一下MFC单文档类的结构: 它包括如下几个类: CAboutDl ...

  6. appium===使用weditor代替ui automator viewer

    weditor 一个元素定位工具,并可实现通过wifi连接移动端进行定位. https://github.com/openatx/uiautomator2 python安装方式: pip instal ...

  7. python实战===老司机奇技淫巧系列之字符转换成图片

    先放两张效果图:

  8. 设计模式之笔记--装饰模式(Decorator)

    装饰模式(Decorator) 定义 装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 类图 描述 Component:被装饰者和装饰者 ...

  9. vue点击切换颜色限制个数(用了mui框架)

    vue点击切换颜色 只能点击一个 <!doctype html> <head> <meta charset="UTF-8"> <title ...

  10. JavaSE项目之聊天室swing版

    引子: 当前,互联网 体系结构的参考模型主要有两种,一种是OSI参考模型,另一种是TCP/IP参考模型. 一.OSI参考模型,即开放式通信系统互联参考模型(OSI/RM,Open Systems In ...