热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BZOJ2595Wc2008游览计划斯坦纳树

题目大意:给定一个矩阵,有一些关键点,每个格子有权值,选择一些格子使所有关键点连通,求最小权值和传说中的斯坦纳树--感觉不是很难理解的样子枚举连通的状态,对于每个状态先对每个位置枚举

题目大意:给定一个矩阵,有一些关键点,每个格子有权值,选择一些格子使所有关键点连通,求最小权值和

传说中的斯坦纳树- - 感觉不是很难理解的样子

枚举连通的状态,对于每个状态先对每个位置枚举子集进行合并,然后对这个状态的分层图进行SPFA

看了几分代码还是ZKY写的比较简洁- -

此外就是终于能通过操作符重载访问结构体里的三维数组了- - 我真是太丧病了233

#include 
#include
#include
#include
#define M 15
#define INF 0x3f3f3f3f
using namespace std;
struct abcd{
int x,y,sta;
abcd() {}
abcd(int _,int __,int ___):
x(_),y(__),sta(___) {}
bool operator ! () const
{
return x==0 && y==0 && sta==0 ;
}
}q[65540];
templateclass Reader{
private:
struct Subreader{
T memory[M][1<<10];
T* operator [] (int x)
{
return memory[x];
}
}memory[M];
public:
T& operator [] (const abcd &x)
{
return memory[x.x][x.y][x.sta];
}
Subreader& operator [] (int x)
{
return memory[x];
}
};
int m,n,cnt;
int map[M][M];
bool mark[M][M];
Reader f;
Reader v;
Reader from;
unsigned short r,h;
void SPFA()
{
static const int dx[]={1,-1,0,0};
static const int dy[]={0,0,1,-1};
int i;
while(r!=h)
{
abcd x=q[++h];v[x]=0;
for(i=0;i<4;i++)
{
abcd y(x.x+dx[i],x.y+dy[i],x.sta);
if(y.x<=0||y.x>m||y.y<=0||y.y>n)
continue;
if(f[y]>f[x]+map[y.x][y.y])
{
f[y]=f[x]+map[y.x][y.y];
from[y]=x;
if(!v[y])
v[y]=1,q[++r]=y;
}
}
}
}
void Steiner_Tree()
{
int i,j,k,sta;
for(sta=1;sta<1< {
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
for(k=sta&sta-1;k;k=sta&k-1)
if(f[i][j][sta]>f[i][j][k]+f[i][j][sta-k]-map[i][j])
{
f[i][j][sta]=f[i][j][k]+f[i][j][sta-k]-map[i][j];
from[i][j][sta]=abcd(i,j,k);
}
if(f[i][j][sta]!=INF)
q[++r]=abcd(i,j,sta),v[i][j][sta]=1;
}
SPFA();
}
}
void DFS(abcd x)
{
if(!from[x]) return ;
mark[x.x][x.y]=1;
abcd temp=from[x];
DFS(temp);
if( x.x==temp.x && x.y==temp.y )
DFS(abcd(temp.x,temp.y,x.sta-temp.sta) );
}
int main()
{
int i,j;
cin>>m>>n;
memset(&f,0x3f,sizeof f);
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
if(!map[i][j])
f[i][j][1< }
Steiner_Tree();
try{
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
if(!map[i][j])
throw(true);
}catch(bool) {}
abcd temp(i,j,(1< cout< DFS(temp);
for(i=1;i<=m;i++,puts("") )
for(j=1;j<=n;j++)
{
if(!map[i][j])
putchar('x');
else if(mark[i][j])
putchar('o');
else
putchar('_');
}
return 0;
}



推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
author-avatar
鬼鬼太子_157
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有