【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
2595: [Wc2008]游览计划
Time Limit: 10 Sec Memory Limit: 256 MBSec Special Judge
Submit: 1572 Solved: 739Description
Input
第一行有两个整数,N和 M,描述方块的数目。
接下来 N行, 每行有 M 个非负整数, 如果该整数为 0, 则该方块为一个景点;
否则表示控制该方块至少需要的志愿者数目。 相邻的整数用 (若干个) 空格隔开,
行首行末也可能有多余的空格。Output
由 N + 1行组成。第一行为一个整数,表示你所给出的方案
中安排的志愿者总数目。
接下来 N行,每行M 个字符,描述方案中相应方块的情况:
z ‘_’(下划线)表示该方块没有安排志愿者;
z ‘o’(小写英文字母o)表示该方块安排了志愿者;
z ‘x’(小写英文字母x)表示该方块是一个景点;
注:请注意输出格式要求,如果缺少某一行或者某一行的字符数目和要求不
一致(任何一行中,多余的空格都不允许出现) ,都可能导致该测试点不得分。Sample Input
4 4
0 1 1 0
2 5 5 1
1 5 5 1
0 1 1 0Sample Output
6
xoox
___o
___o
xooxHINT
对于100%的数据,N,M,K≤10,其中K为景点的数目。输入的所有整数均在[0,2^16]的范围内
Source
Ljcc930提供SPJ
【分析】
又是不会的一题啦~
斯坦纳树?smg?
刚开始看题可能觉得是最小生成树吧?但是并不是的。
一个条路径可能在最小生成树上面算几次,但是在这题上只算一次。
然后就是斯坦纳树??【长姿势??
反正就是,要覆盖的点很少<=10,可以状压这个,f[i][j][t]表示和(i,j)这个格子联通的需覆盖点集合为t的最小代价。
两个方程:
$f[i][j][t]=min(f[i][j][s]+f[i][j][t-ss])$ s是t的子集。
$f[i][j][t]=min(f[x][y][t]+a[i][j])$ (i,j)与(x,y)相邻
第二个式子啊不是普通的dp啊,转移状态的有环的!!但是,不怕,肯定是小的转到大的,然后一脸最短路的样子,就可以用spfa解决的。
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 using namespace std; 8 #define INF 0xfffffff 9 10 int a[15][15],num[15][15],f[15][15][1500]; 11 12 struct node {int x,y,d;}; 13 node g[15][15][1500]; 14 queue<node > q; 15 bool inq[15][15]; 16 17 int bx[6]={0,1,0,-1,0}, 18 by[6]={0,0,1,0,-1}; 19 20 void dfs(int x,int y,int k) 21 { 22 if(!k) return;inq[x][y]=1; 23 dfs(g[x][y][k].x,g[x][y][k].y,g[x][y][k].d); 24 if(g[x][y][k].x==x&&g[x][y][k].y==y) dfs(x,y,k-g[x][y][k].d); 25 } 26 27 int main() 28 { 29 int n,m,cnt=0; 30 scanf("%d%d",&n,&m); 31 memset(f,63,sizeof(f)); 32 for(int i=1;i<=n;i++) 33 for(int j=1;j<=m;j++) 34 { 35 scanf("%d",&a[i][j]); 36 if(a[i][j]==0) 37 { 38 num[i][j]=++cnt; 39 f[i][j][1<<cnt-1]=0; 40 g[i][j][1<<cnt-1].x=g[i][j][1<<cnt-1].y=g[i][j][1<<cnt-1].d=0; 41 } 42 } 43 for(int i=1;i<=n;i++) 44 for(int j=1;j<=m;j++) f[i][j][0]=0; 45 for(int k=1;k<=(1<<cnt)-1;k++) 46 { 47 memset(inq,0,sizeof(inq)); 48 for(int ss=k;ss;ss=(ss-1)&k) 49 { 50 for(int i=1;i<=n;i++) 51 for(int j=1;j<=m;j++) //if(a[i][j]==0) 52 { 53 if(f[i][j][k]>f[i][j][ss]+f[i][j][k-ss]-a[i][j]) 54 { 55 f[i][j][k]=f[i][j][ss]+f[i][j][k-ss]-a[i][j]; 56 node nw; 57 nw.x=i;nw.y=j;nw.d=ss; 58 g[i][j][k]=nw; 59 } 60 if(f[i][j][k]<INF) {node nw;nw.x=i;nw.y=j;nw.d=f[i][j][k];inq[i][j]=1;q.push(nw);} 61 } 62 63 } 64 while(!q.empty()) 65 { 66 node x=q.front(); 67 for(int i=1;i<=4;i++) 68 { 69 int nx=x.x+bx[i],ny=x.y+by[i]; 70 if(nx<1||nx>n||ny<1||ny>m) continue; 71 if(f[nx][ny][k]>f[x.x][x.y][k]+a[nx][ny]) 72 { 73 f[nx][ny][k]=f[x.x][x.y][k]+a[nx][ny]; 74 node nw; 75 nw.x=nx;nw.y=ny;//nw.d=f[nx][ny][k]; 76 // g[nx][ny][k]=g[x.x][x.y][k]; 77 g[nx][ny][k].x=x.x;g[nx][ny][k].y=x.y;g[nx][ny][k].d=k; 78 if(!inq[nx][ny]) 79 { 80 inq[nx][ny]=1; 81 q.push(nw); 82 } 83 } 84 } 85 q.pop();inq[x.x][x.y]=0; 86 } 87 } 88 memset(inq,0,sizeof(inq)); 89 bool ok=0; 90 for(int i=1;i<=n;i++) 91 { 92 for(int j=1;j<=m;j++) if(a[i][j]==0) 93 { 94 printf("%d\n",f[i][j][(1<<cnt)-1]); 95 dfs(i,j,(1<<cnt)-1); 96 ok=1;break; 97 } 98 if(ok) break; 99 } 100 101 for(int i=1;i<=n;i++) 102 { 103 for(int j=1;j<=m;j++) 104 { 105 if(a[i][j]==0) printf("x"); 106 else if(inq[i][j]) printf("o"); 107 else printf("_"); 108 } 109 printf("\n"); 110 } 111 return 0; 112 }
View Code
2017-04-05 19:28:31
转载于:https://www.cnblogs.com/Konjakmoyu/p/6670219.html
【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)相关推荐
- BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2734 题解 嗯早就想写的题,昨天因为某些不可告人的原因(大雾)把这题写了,今天再来写题解 ...
- bzoj 1072: [SCOI2007]排列perm(状压dp)
1072: [SCOI2007]排列perm Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2272 Solved: 1432 [Submit][ ...
- BZOJ 1087 SCOI2005 互不侵犯King 状压DP
题目大意:给定n*n的国际象棋棋盘.在上面放k个国王,要求国王之间互不攻击.求方案数 n<=⑨ 状压DP.将每一行的方案二进制压成一维,令f[i][j][k]为第i行用去j个国王状态为k的方案数 ...
- BZOJ 4416: [Shoi2013]阶乘字符串【状压DP
--不那么裸的状压dp-- 当字符集大于21的时候直接输出不满足--原因啊----大了就跑不过了 --大概就是不能得到嘛[大佬们并没有讨论出结果在下只是听的题解[x 用f[i][j]表示第i个字符前 ...
- BZOJ.4160.[NEERC2009]Exclusive Access 2(状压DP Dilworth定理)
BZOJ DAG中,根据\(Dilworth\)定理,有 \(最长反链=最小链覆盖\),也有 \(最长链=最小反链划分数-1\)(这个是指最短的最长链?并不是很确定=-=),即把所有点划分成最少的集合 ...
- BZOJ 3195: [Jxoi2012]奇怪的道路 | 状压DP
不是我吹牛逼 想了1min就想出来的题真是 超水的 题太简单了 解释就不解释了 #include<cstdio> #define P 1000000007 using namespace ...
- BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP
[题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...
- 【BZOJ-1097】旅游景点atr SPFA + 状压DP
1097: [POI2007]旅游景点atr Time Limit: 30 Sec Memory Limit: 357 MB Submit: 1531 Solved: 352 [Submit][S ...
- BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...
最新文章
- 计算机视觉——自动识别车牌简介
- 【计算理论】计算复杂性 ( coNP 问题 | coNP 完全 | P、NP、coNP 相互关系 )
- 【NLP】TransformerXL:因为XL,所以更牛
- HTML+CSS+JS实现 ❤️酷炫的时光隧道旅行动特效❤️
- JS: 浅拷贝vs深拷贝 | 刷题打卡
- unity字符串换行符_unity如何在中文文本换行时实现排版换行,避免标点符号出现在行首等比较丑的情况?...
- 移动端前端笔记 — 遇到的常见JS与CSS问题及解决方法
- 全球域名商解析新增量18强:万网易名位居三甲
- 超链接把一个值传到多个页面的方法
- 最护眼的电脑屏幕颜色是黑色?
- windows下cfree5中%d输出浮点数的问题
- 【学习笔记】大数据可视化简介
- Linux命令:ls -l(ll)结果解析
- 一台电脑寿命一般几年?
- Ubuntu16.04开启SSH服务
- Storm0.9.6安装教程
- securecrt导出linux日志文件,secureCRT保存屏幕输出内容
- 【滤波跟踪】基于随机有限集的多目标跟踪算法附matlab代码
- 【RHCE】NFS服务器简介及简单共享目录配置
- 介绍Mybatis与使用(什么是Mybatis?)