BZOJ 2595 斯坦那树
很久以前就想做,后来弃坑了。
最近又在群里有人问了类似的问题,艾老师说是斯坦纳树(%%%)
就是状压DP,然后用Spfa对状态进行转移.
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int Maxn=;
const int Maxm=;
const int Inf=0x3f3f3f3f;
const int Px=;
const int Py=;
const int dx[]={,,,-};
const int dy[]={,-,,};
//==================================
int n,m,K,Sta,g[Maxn][Maxn],f[Maxn][Maxn][Maxm],pre[Maxn][Maxn][Maxm],STA[Maxn][Maxn];
bool used[],Ans[Maxn][Maxn];
queue<int> Q;
inline int Calc(int x,int y,int s) {return x*Px+y*Py+s;}
inline bool Check(int a,int b) {return (a|b)==a;}
inline bool Judge(int x,int y) {return (x>= && x<=n) && (y>= && y<=m);}
void Spfa(int sta)
{
while (!Q.empty())
{
int u=Q.front(); Q.pop();
int x=u/Px,y=u%Px/Py;
for (int d=;d<;d++)
{
int p=x+dx[d],q=y+dy[d];
int r=sta|STA[p][q];
if (!Judge(p,q)) continue;
if (f[p][q][r]>f[x][y][sta]+g[p][q])
{
f[p][q][r]=f[x][y][sta]+g[p][q];
pre[p][q][r]=u;
int k=Calc(p,q,r);
if (!used[k] && sta==r) used[k]=true,Q.push(k);
}
}
used[u]=false;
}
} void Init(int x,int y,int sta)
{
Ans[x][y]=true;
int k=pre[x][y][sta];
if (!k) return;
int i=k/Px,j=k%Px/Py,s=k%Px%Py;
Init(i,j,s);
if (i==x && j==y) Init(i,j,sta-s);
} void Out()
{
for (int i=;i<=n;i++)
{
for (int j=;j<=m;j++)
if (Ans[i][j])
if (g[i][j]) putchar('o'); else putchar('x');
else putchar('_');
putchar('\n');
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int k=;k<=(<<);k++) f[i][j][k]=Inf; for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
scanf("%d",&g[i][j]);
if (!g[i][j]) STA[i][j]=(<<(K++)),f[i][j][STA[i][j]]=;
}
Sta=(<<K);
for (int sta=;sta<Sta;sta++)
{
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
for (int s=;s<sta;s++)
if (Check(sta,s))
if (f[i][j][sta]>f[i][j][s]+f[i][j][sta-s]-g[i][j])
f[i][j][sta]=f[i][j][s]+f[i][j][sta-s]-g[i][j],
pre[i][j][sta]=Calc(i,j,s);
if (f[i][j][sta]!=Inf)
Q.push(Calc(i,j,sta)),used[Calc(i,j,sta)]=true;
}
Spfa(sta);
} for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (!g[i][j])
{
printf("%d\n",f[i][j][Sta-]);
Init(i,j,Sta-);
Out();
return ;
}
return ;
}
C++
BZOJ 2595 斯坦那树的更多相关文章
- bzoj 2595 斯坦纳树
题目大意: 选定一些格子保证景点对应的格子通过这些格子连通,保证选定的所有格子对应的权值和最小 这是相当于理解为将所有点形成的最小生成树 这里点的个数很少,所以可以对每一个点进行状态压缩 f[st][ ...
- 【BZOJ 2595】【WC 2008】游览计划
http://www.lydsy.com/JudgeOnline/problem.php?id=2595 斯坦纳树的例题诶...我怎么做了好长时间_(:з」∠)_ 首先这是一棵树. 状压表示状态,\( ...
- bzoj 2595 [Wc2008]游览计划(斯坦纳树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2595 [题意] 给定N*M的长方形,选最少权值和的格子使得要求的K个点连通. [科普] ...
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划 Time Limit: 10 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 1572 Solved: 7 ...
- BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】
传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Stein ...
- BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树
[题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...
- BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...
- bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4006 [题意] 给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的 ...
- bzoj 4006 管道连接 —— 斯坦纳树+状压DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...
随机推荐
- c#链接数据库
using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Linq; usin ...
- Underscore.js 初探
一. 简介 Underscore 这个单词的意思是“下划线”. Underscore.js 是一个 JavaScript 工具库,提供了一整套的辅助方法供你使用. Think that - ...
- c++实现蛇形矩阵总结
蛇形矩阵,百度了一下,是这么一个东西: 像一条蛇一样依次递增. 我想,竟然做了螺旋矩阵,那做一下这个吧.在之前的螺旋矩阵的main函数基础上,写个函数接口就行了,这一次做的很快,但是这个矩阵感觉比螺旋 ...
- Cheatsheet: 2015 07.01 ~ 07.31
Java JBoss Drools Tutorial for Beginners Other A Simple File System RebornDB: the Next Generation Di ...
- MySQL安装(转)
本文介绍MySQL的安装 可以单独阅读,也可以作为PHP环境搭建的一部分 PHP完整配置信息请参考 http://www.cnblogs.com/azhe-style/articles/php_env ...
- iOS开发 百度坐标点的计算
BMKMapPoint point1 = BMKMapPointForCoordinate(_userGps); BMKMapPoint point2 = BMKMapPointForCoordina ...
- zabbix3.0.4 部署之五 (LNMP > nginx1.9.9)
1 wget http://nginx.org/download/nginx-1.9.9.tar.gz cd /opt/pcre-8.35 autoreconf -ivf Installing sha ...
- jsp项目与mysql链接
因为毕设是地下车库管理系统,所以打算学习jsp进行开发~ 今天主要是[新建网站项目+mysql链接],在此篇之前所做的工作:tomcat服务器配置,mysql数据库的安装与启用(在之后的开发中可以使用 ...
- Oracle job定时器的执行时间间隔学习汇总
Oracle job 定时器的执行时间间隔也是定时器job 的关键设置,在这一设置上,开始还没掌握,总是不知道怎么写,现总结如下,其实主要是使用了TRUNC.NEXT_DAY .ADD_MONTH ...
- HTML5基本元素初探
最近看了一些HTML5的基础知识,写了一些小案例,记录一下,方便查找. 1.新建的HTML5页面中显著的变化是:DOCTYPE声明变简洁(<!DOCTYPE html>) / <me ...