[WC2008]游览计划

斯坦纳树板子题,其实就是状压dp

令\(dp_{i,s}\)表示任意点\(i\)联通关键点集合\(s\)的最小代价

然后有转移

\[dp_{i,S}=\min_{T\in S}dp_{i,S}+dp_{i,S \ xor\ T}-cost_i
\]

这是自己转移自己

\[dp_{u,S}=\min_{(u,v)\in E}dp_{v,S}+cost_u
\]

这是从别人转移

我们按\(S\)分层去做,注意到别人转移是无后效性的,但长的像松弛,直接跑spfa就可以了


Code:

#include <cstdio>
#include <cstring>
#include <queue>
const int inf=0x3f3f3f3f;
int n,m,k,dp[11][11][1<<10],cost[11][11],vis[11][11];
struct node
{
int x,y,s;
node(){}
node(int X,int Y,int S){x=X,y=Y,s=S;}
}pre[11][11][1<<10];
#define mp(a,b) std::make_pair(a,b)
std::queue <std::pair <int,int> > q;
const int dx[5]={0,-1,0,1,0};
const int dy[5]={0,0,1,0,-1};
void spfa(int s)
{
while(!q.empty())
{
int x=q.front().first,y=q.front().second;
q.pop();
vis[x][y]=0;
for(int i=1;i<=4;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx&&ty&&tx<=n&&ty<=m&&dp[tx][ty][s]>dp[x][y][s]+cost[tx][ty])
{
dp[tx][ty][s]=dp[x][y][s]+cost[tx][ty];
pre[tx][ty][s]=node(x,y,s);
if(!vis[tx][ty]) q.push(mp(tx,ty)),vis[tx][ty]=1;
}
}
}
}
void dfs(int x,int y,int s)
{
if(!x||!y||!s) return;
vis[x][y]=1;
int tx=pre[x][y][s].x,ty=pre[x][y][s].y,t=pre[x][y][s].s;
dfs(tx,ty,t^s);
dfs(tx,ty,t);
}
int main()
{
scanf("%d%d",&n,&m);
memset(dp,0x3f,sizeof dp);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&cost[i][j]);
if(cost[i][j]) dp[i][j][0]=cost[i][j];
else dp[i][j][1<<k++]=0;
}
for(int s=1;s<1<<k;s++)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
for(int t=s;t;t=t-1&s)
if(dp[i][j][s]>dp[i][j][t]+dp[i][j][s^t]-cost[i][j])
{
dp[i][j][s]=dp[i][j][t]+dp[i][j][s^t]-cost[i][j];
pre[i][j][s]=node(i,j,t);
}
if(dp[i][j][s]<inf) q.push(mp(i,j)),vis[i][j]=1;
}
spfa(s);
}
int tx=0,ty=0,s=(1<<k)-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(dp[i][j][s]<dp[tx][ty][s])
tx=i,ty=j;
printf("%d\n",dp[tx][ty][s]);
dfs(tx,ty,s);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
putchar(vis[i][j]?(cost[i][j]?'o':'x'):'_');
putchar('\n');
}
return 0;
}

2019.2.26

最新文章

  1. Qt控件样式 Style Sheet Demo
  2. grootJs的属性绑定指令
  3. EDIUS设置采集磁带的方法
  4. sharepoint 2013 &quot;The module ... owssvr.dll could not be loaded due to a configuration problem&quot;
  5. Android开发之动画(转)
  6. jquery利用event.which方法获取键盘输入值的代码
  7. 初次使用IntelliJ IDEA 2016.2
  8. Unity 脚本中update,fixedupdate,lateupdate等函数的执行顺序
  9. vue关闭代码检查eslint
  10. 【kubenetus】kubenetus运维
  11. 构建SFTP服务
  12. 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件
  13. Springboot+Thymeleaf+layui框架的配置与使用
  14. debian镜像下载地址
  15. 新型DenseBody框架:一张照片获得3D人体信息
  16. struts2框架
  17. BZOJ2568 比特集合(树状数组)
  18. Spring(二十):Spring AOP(四):基于配置文件的方式来配置 AOP
  19. 10 star组件之分页, search模糊查询, action批量处理
  20. 谷歌地图api 开发 (转载)

热门文章

  1. zabbix使用jmx监控tomcat
  2. c# winform导出Excel
  3. Java 异常处理的误区和经验总结
  4. Azure系列2.1.6 —— BlobProperties
  5. [转帖]windows+xshell+xming访问非桌面版Linux服务器
  6. bootstrap3兼容IE8
  7. 大白跟着“菜鸟”学node——同名事件
  8. python之路--MySQL数据库初识
  9. scrapy架构简介
  10. loadrunner 事务、同步点和思考时间