#斯坦纳树#洛谷 4294 [WC2008]游览计划
分析
几乎就是模板题,考虑不同点就是它是点权,
所以在求两个子集的时候要减去这个点的点权,
还有一点恶心的就是要输出方案,令人作呕
代码
#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]游览计划的更多相关文章
- 洛谷4294  [WC2008]游览计划——斯坦纳树
		题目:https://www.luogu.org/problemnew/show/P4294 大概是状压.两种转移,一个是以同一个点为中心,S由自己的子集拼起来:一个是S相同.中心不同的同层转移. 注 ... 
- 洛谷 P4294 [WC2008]游览计划
		题目链接 不是很会呢,但似乎抄了题解后有点明白了 sol:状态DP显然,其实是要构建一棵最小生成树一样的东西,我自己的理解(可能不是很对哦希望多多指教)f[x][y][zt]就是到x,y这个点,状态为 ... 
- Luogu 4294 [WC2008]游览计划 | 斯坦纳树
		题目链接 Luogu 4294 (我做这道题的时候BZOJ全站的SPJ都炸了 提交秒WA 幸好有洛谷) 题解 这道题是[斯坦纳树]的经典例题.斯坦纳树是这样一类问题:带边权无向图上有几个(一般约10个 ... 
- 【BZOJ2595_洛谷4294】[WC2008]游览计划(斯坦纳树_状压DP)
		上个月写的题qwq--突然想写篇博客 题目: 洛谷4294 分析: 斯坦纳树模板题. 简单来说,斯坦纳树问题就是给定一张有边权(或点权)的无向图,要求选若干条边使图中一些选定的点连通(可以经过其他点) ... 
- BZOJ_2595_[Wc2008]游览计划_斯坦纳树
		BZOJ_2595_[Wc2008]游览计划_斯坦纳树 题意: 分析: 斯坦纳树裸题,有几个需要注意的地方 给出矩阵,不用自己建图,但枚举子集转移时会算两遍,需要减去当前点的权值 方案记录比较麻烦,两 ... 
- 【BZOJ2595】[Wc2008]游览计划 斯坦纳树
		[BZOJ2595][Wc2008]游览计划 Description Input 第一行有两个整数,N和 M,描述方块的数目. 接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为 ... 
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
		2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ... 
- 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$为根的最小代 ... 
- 洛谷 P7450 - [THUSCH2017] 巧克力(斯坦纳树+随机化)
		洛谷题面传送门 9.13 补之前 8.23 做的题,不愧是鸽子 tzc( 首先我们先来探讨一下如果 \(c_{i,j}\le k\) 怎么做,先考虑第一问.显然一个连通块符合条件当且仅当它能够包含所有 ... 
随机推荐
- File.delete()和Files.delete(Path path)的区别
			文件删除时可以选择File.delete()和Files.delete(Path path),这两个方法到底有什么区别呢? //删除暂存的pdfFile file =new File(pdfFilen ... 
- 项目实战:Qt+OpenCV激光射击游(识别激光、识别圆)
			若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ... 
- Flutter学习
			常用网址 免费下载 !<AliFlutter 体系化建设和实践> Flutter 开发文档 Flutter实战 Dart 编程语言概览 pub仓库 main函数使用了(=>)符号, ... 
- Ubuntu虚拟机开机显示initramfs
			因为我的虚拟机路径放在了移动硬盘当中,所以连接有点失常就断开了,紧接着虚拟机也异常关闭了. 重启后进入了initramfs界面 查看出错的分区,如下图所示,是/dev/sda5分区有损坏 解决方法: ... 
- 【Azure Function App】在ADF(Azure Data Factory)中调用 Azure Function 时候遇见 Failed to get MI access token
			问题描述 在ADF(Azure Data Factory)中,调用Azure Function App中的Function,遇见了 Failed to get MI access token Ther ... 
- 【Azure Fabric Service】Service Fabric 遇见错误信息记录 - The process/container terminated with exit code:2148734499
			问题描述 Service Fabric 在升级 Application 过程中,发布了新的代码后,启动应用中遇见了如下错误: Error message: System.Hosting' report ... 
- Program type already present: com.xxx
			该错误是由于工程中存在着相同的类导致(包名与类名都相同),有可能是不同的依赖中有着相同的类,全局搜索该类便可得知 
- 迈向现代化的.NET配置指北
			一.欢呼 .NET Standard 时代 我现在已不大提 .NET Core,对于我来说,未来的开发将是基于 .NET Standard,不仅仅是面向未来 ,也是面向过去:不只是 .NET Co ... 
- SpringMVC快速复习(超详细)
			目录 一.SpringMVC简介 1.什么是MVC 2.什么是SpringMVC 3.SpringMVC的特点 二.HelloWorld 1.开发环境 2.创建maven工程 a>添加web模块 ... 
- mybatis查询大批量数据的几种方式
			问题背景 公司里有很多需要跑批数据的场景,这些数据几十万到几千万不等,目前我们采用的是分页查询,但是分页查询有个深度分页问题,上百万的数据就会查询的很慢 常规解决方案 全量查询 分页查询 流式查询 游 ... 
