【CodeChef】Find a special connected block - CONNECT(斯坦纳树)

题面

Vjudge

题解

还是一样的套路题,把每个数字映射到\([0,K)\)的整数,然后跑斯坦纳树,重复多次就有很大概率出解。

但是别乱随机,我直接随机\(WA\)成sb了,后来学了别人代码用自己手写的伪随机数就过了。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define MAX 16
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
map<int,int> M;
int n,m,K,ans=2e9;
int a[MAX*MAX],b[MAX*MAX],c[MAX*MAX];
int f[1<<7][MAX*MAX];
queue<int> Q;bool vis[MAX*MAX];
vector<int> E[MAX*MAX];
int ID(int x,int y){return (x-1)*m+y;}
int d[4][2]={-1,0,0,-1,1,0,0,1};
void SPFA(int S)
{
while(!Q.empty())
{
int u=Q.front();Q.pop();
for(int v:E[u])
if(f[S][v]>f[S][u]+b[v])
{
f[S][v]=f[S][u]+b[v];
if(!vis[v]&&f[S][v]<=ans)vis[v]=true,Q.push(v);
}
vis[u]=false;
}
}
unsigned int Rand()
{
static unsigned int x=19260817;
x^=(x<<5);x^=(x>>17);x^=(x<<13);
return x;
}
int main()
{
n=read();m=read();K=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)a[ID(i,j)]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)b[ID(i,j)]=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(~a[ID(i,j)])
for(int k=0;k<4;++k)
{
int x=i+d[k][0],y=j+d[k][1];
if(x<1||y<1||x>n||y>m||a[ID(i,j)]==-1)continue;
E[ID(i,j)].push_back(ID(x,y));
}
for(int Tim=1;Tim<=500;++Tim)
{
M.clear();
for(int i=1;i<=n*m;++i)
if(~a[i])
{
if(!M.count(a[i]))M[a[i]]=Rand()%K;
c[i]=M[a[i]];
}
memset(f,63,sizeof(f));
for(int i=1;i<=n*m;++i)if(~a[i])f[a[i]?(1<<c[i]):0][i]=b[i];
for(int S=0;S<(1<<K);++S)
{
for(int i=1;i<=n*m;++i)
{
if(a[i]==-1)continue;
for(int T=(S-1)&S;T;T=(T-1)&S)
f[S][i]=min(f[S][i],f[T][i]+f[S^T][i]-b[i]);
if(f[S][i]<=ans)Q.push(i),vis[i]=true;
}
SPFA(S);
}
for(int i=1;i<=n*m;++i)if(~a[i])ans=min(ans,f[(1<<K)-1][i]);
}
printf("%d\n",(ans>1e9)?-1:ans);
return 0;
}

【CodeChef】Find a special connected block - CONNECT(斯坦纳树)的更多相关文章

  1. BZOJ2595: [Wc2008]游览计划(斯坦纳树,状压DP)

    Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 2030  Solved: 986[Submit][Status][ ...

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

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

  3. 【BZOJ2595】游览计划(状压DP,斯坦纳树)

    题意:见题面(我发现自己真是越来越懒了) 有N*M的矩阵,每个格子有一个值a[i,j] 现要求将其中的K个点(称为关键点)用格子连接起来,取(i,j)的费用就是a[i,j] 求K点全部连通的最小花费以 ...

  4. HDU 4085 斯坦纳树

    题目大意: 给定无向图,让前k个点都能到达后k个点(保护地)中的一个,而且前k个点每个需要占据后k个中的一个,相互不冲突 找到实现这个条件达到的选择边的最小总权值 这里很容易看出,最后选到的边不保证整 ...

  5. hdu4085 Peach Blossom Spring 斯坦纳树,状态dp

    (1)集合中元素表示(1<<i), i从0开始 (2)注意dp[i][ss] = min(dp[i][ss], dp[i][rr | s[i]] + dp[i][(ss ^ rr) | s ...

  6. hdu 3311 斯坦纳树

    思路:虚拟一个0号节点,将每个点建一条到0号节点的边,权值为挖井需要的价值.并要保证0号节点同另外n个寺庙一样被选择即可. 然后就是求斯坦纳树了. #include<map> #inclu ...

  7. HDU 3311 Dig The Wells(斯坦纳树)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3311 [题意] 给定k座庙,n个其他点,m条边,点权代表挖井费用,边权代表连边费用,问使得k座庙里 ...

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

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

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

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

随机推荐

  1. android 启动流程 相关2 init进程 属性服务

    Init属性服务 系统属性服务 属性梳理 来源和读取时机 来源:内核参数 ro.kernel.*   代表有qemu内核参数才会设置(在虚拟机中) ro.boot.*     1.内核设备树相关的设备 ...

  2. 工具推荐--刷LeetCode的神器

    本文首发于微信公众号:[坂本先生],文章地址为: https://mp.weixin.qq.com/s/vHv5hO8nils_g2VSKwu1Cg如有转载请标明出处 今天给大家安利一款快速刷Leet ...

  3. (day68)Vue-CLI项目、页面跳转和传参、生命周期钩子

    目录 一.Vue-CLI (一)环境搭建 (二)项目的创建 (三)项目目录结构 (四)Vue组件(.vue文件) (五)全局脚本文件main.js(项目入口) (六)Vue请求生命周期 二.页面跳转和 ...

  4. filter,map,reduce三个数组高阶函数的使用

    filter ,map ,reduce三个高阶函数的使用 普通方法解决数据问题 const nums1= [10,20,111,222,444,40,50] // 需求1.取出小于100的数字 // ...

  5. 四面快手、终拿Offer,想告诉你的一些事情

    本篇面经来自于群里粉丝朋友的分享,希望对你有所帮助! 快手高开及以上职级面试 是没有笔试或者机试的,所以从第一轮开始就是直接面对面试官. 一轮 主要考察对Java基础的理解和深入程度. Spring ...

  6. .net Core 使用AutoMapper

    在我们的项目中慢慢的要把数据库的实体模型和视图模型进行分离,防止被人拿到我们表字段.在学校的时候自己只是有将很多数据库模型,写成一个视图模型返回到前台. 首先我们把这两个包引入项目中去. 然后我们创建 ...

  7. js实现post方式的异步请求

    <%@ page contentType="text/html;charset=UTF-8" language="java" %><html& ...

  8. C#中 EF 性能优化

    https://www.cnblogs.com/chenwolong/p/7531955.html EF使用AsNoTracking(),无跟踪查询技术(查询出来的数据不可以修改,如果你做了修改,你会 ...

  9. 【C#】学习笔记(4) 值类型和引用类型相关(Null相关)

    Reference and Value Types Value Types(值类型): struct(结构体) 独立的实例或者是拷贝 值的改变不会影响其它拷贝 值就是它所代表的信息 没有引用,所以不可 ...

  10. Burpsuite抓取https数据包

    Burpsuite抓取https包 浏览器代理设置 Burpsuite代理设置 启动Burpsuite,浏览器访问127.0.0.1:8080,点击CA Certificate,下载cacert.de ...