很久以前就想做,后来弃坑了。

最近又在群里有人问了类似的问题,艾老师说是斯坦纳树(%%%)

就是状压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 斯坦那树的更多相关文章

  1. bzoj 2595 斯坦纳树

    题目大意: 选定一些格子保证景点对应的格子通过这些格子连通,保证选定的所有格子对应的权值和最小 这是相当于理解为将所有点形成的最小生成树 这里点的个数很少,所以可以对每一个点进行状态压缩 f[st][ ...

  2. 【BZOJ 2595】【WC 2008】游览计划

    http://www.lydsy.com/JudgeOnline/problem.php?id=2595 斯坦纳树的例题诶...我怎么做了好长时间_(:з」∠)_ 首先这是一棵树. 状压表示状态,\( ...

  3. bzoj 2595 [Wc2008]游览计划(斯坦纳树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2595 [题意] 给定N*M的长方形,选最少权值和的格子使得要求的K个点连通. [科普] ...

  4. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

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

  5. BZOJ 2595: [Wc2008]游览计划 [DP 状压 斯坦纳树 spfa]【学习笔记】

    传送门 题意:略 论文 <SPFA算法的优化及应用> http://www.cnblogs.com/lazycal/p/bzoj-2595.html 本题的核心就是求斯坦纳树: Stein ...

  6. BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树

    [题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...

  7. BZOJ 4006 Luogu P3264 [JLOI2015]管道连接 (斯坦纳树、状压DP)

    题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4006 (luogu)https://www.luogu.org/probl ...

  8. bzoj 4006 [JLOI2015]管道连接(斯坦纳树+状压DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4006 [题意] 给定n点m边的图,连接边(u,v)需要花费w,问满足使k个点中同颜色的 ...

  9. bzoj 4006 管道连接 —— 斯坦纳树+状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4006 用斯坦纳树求出所有关键点的各种连通情况的代价,把这个作为状压(压的是集合选择情况)的初 ...

随机推荐

  1. C#单独启动进程的几种方式

    本文实例讲述了C#启动进程的几种常用方法.分享给大家供大家参考.具体如下: 1.启动子进程,不等待子进程结束 private void simpleRun_Click(object sender, S ...

  2. CentOS 7安装Mysql并设置开机自启动

    CentOS 7不带Mysql数据库了,默认的数据库是MariaDB(Mysql的一个分支). 可以按照以下步骤手动安装Mysql数据库. 1. 下载rpm安装文件 wget http://repo. ...

  3. php : 类常量

    使用总结: 1.不能使用 define 来定义 2.通过 "类名::常量名" 来获取 /** * PHP类常量 * * 类常量属于类自身,不属于对象实例,不能通过对象实例访问 * ...

  4. 配置org.springframework.scheduling.quartz.CronTriggerBean (转载)

    在项目中又用到了定时器,对于定时器的应用总是模模糊糊的,今天结合网上找到的资料与自己在项目中写的简单地在此写一下,以备需要时查阅. 一个Quartz的CronTrigger表达式分为七项子表达式,其中 ...

  5. python核心编程第六章练习6-13

    6-13.字符串.string模块包含三个函数,atoi(),atol()和atof(),他们分别负责把字符串转换成整型.长整型和浮点型数字.从Python 1.5起,Python的内建函数int() ...

  6. python核心编程第六章练习6-12

    6-12.字符串.(a)创建一个名字为findchr()的函数,函数声明如下.def findchr(string, char)findchr()要在字符串string中查找字符char,找到就返回该 ...

  7. python核心编程第六章练习6-11

    6-11.转换.(a)创建一个从整型到IP地址的转换,如下格式:www.xxx.yyy.zzz.(b)更新你的程序,使之可以逆转换.[答案](a)代码如下: Input_number = abs(in ...

  8. 实体类调用泛型父类中的静态方法中执行CRUD——第二版

    using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; namespa ...

  9. Centos7 下配置mysql5.6主从复制实例(一主两从)

    标签:mysql 数据库 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://8941355.blog.51cto.com/89313 ...

  10. 51nod 1459 迷宫游戏(dij)

    题目链接:51nod 1459 迷宫游戏 dij裸题. #include<cstdio> #include<cstring> #include<algorithm> ...