原题走这里

看起来就很难的一道题

本题存在一个小陷阱,它看起来像是单回路模型(毕竟是求路径),然而它其实是多回路模型,或者说可以用多回路模型做。
这道题求的是最短距离,那么这就意味着如果出现了多出来的一个回路,那么它就会因为带来了额外的距离而被舍去。
于是乎,我们就可以用多回路也就是Eat the trees的思路来转移,但是路径分为2和3两种,所以轮廓线上的状态也有0,2,3三种,用四进制表示即可。
细节很多,要小心。

代码如下:

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <map>
#define chkmin(x,y) x=min(x,y);
using namespace std;
int n,m,d[2][60000],H[60000],s,a[20][20],IH[1<<20];
void getHash(int k,int x)
{if(k==m+1){IH[x]=s;H[s++]=x;return;}getHash(k+1,x<<2);getHash(k+1,x<<2|2);getHash(k+1,x<<2|3);
}
int dp()
{memset(d,0x3f,sizeof(d));d[1][0]=0;for(register int i=1,cur=1;i<=n;i++,cur^=1){for(register int j=0;j<m;j++,cur^=1){memset(d[cur^1],0x3f,sizeof(d[cur^1]));for(int k=0;k<s;k++){register int temp=d[cur][k],t=H[k],x=t>>(j<<1)&3,y=t>>((j+1)<<1)&3;if(temp>1000)continue;if(a[i][j]==0){if(x==y){if(x){chkmin(d[cur^1][IH[t^(x<<(j<<1))^(y<<((j+1)<<1))]],temp+1);}else{chkmin(d[cur^1][IH[t^(10<<(j<<1))]],temp+1);chkmin(d[cur^1][IH[t^(15<<(j<<1))]],temp+1);    chkmin(d[cur^1][k],temp);}}   if(x+y==2||x+y==3){chkmin(d[cur^1][k],temp+1);chkmin(d[cur^1][IH[t^((x|y)<<(j<<1))^((x|y)<<((j+1)<<1))]],temp+1); }}else if(a[i][j]==1){if(x==0&&y==0){chkmin(d[cur^1][k],temp);}}else{if(x==0&&y==0){chkmin(d[cur^1][IH[t^(a[i][j]<<(j<<1))]],temp+1);chkmin(d[cur^1][IH[t^(a[i][j]<<((j+1)<<1))]],temp+1);}if(x+y==a[i][j]){chkmin(d[cur^1][IH[t^(x<<(j<<1))^(y<<((j+1)<<1))]],temp+1);}}}}memset(d[cur^1],0x3f,sizeof(d[cur^1])); for(int j=0;H[j]<(1<<(m<<1));j++){if(d[cur][j]>1000)continue;chkmin(d[cur^1][IH[H[j]<<2]],d[cur][j]); }}return (d[n*(m+1)%2][0]>1000)?0:d[n*(m+1)%2][0]-2;
}
int main()
{while(cin>>n>>m){if(n==0)break;memset(H,0,sizeof(H));s=0;memset(IH,0,sizeof(IH));for(int i=1;i<=n;i++){for(int j=0;j<m;j++){cin>>a[i][j];}}getHash(0,0);cout<<dp()<<endl; } return 0;
}

【POJ3133】Manhattan Wiring 插头DP相关推荐

  1. [POJ3133]Manhattan Wiring 插头dp

    [POJ3133]Manhattan Wiring 插头dp 原题POJ3133 题意:N*M有障碍矩阵,0可通过,1为障碍,两个2,两个3,求连接两个2和连接两个3的两条不相交路径长度和的最小值(1 ...

  2. POJ 3133 Manhattan Wiring(插头DP)

    题目链接:http://poj.org/problem?id=3133 题意:n*m的格子中有两个2和两个3,其余是空白或障碍.找出两条路径分别连接2和3,不经过障碍且不相交.使得两条路径长度和最短? ...

  3. [Poj3133]Manhattan Wiring (插头DP)

    Description 题目大意:给你个N x M(1≤N, M≤9)的矩阵,0表示空地,1表示墙壁,2和3表示两对关键点.现在要求在两对关键点之间建立两条路径,其中两条路径不可相交或者自交(就是重复 ...

  4. poj3133 Manhattan Wiring

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2016   Accepted: 1162 ...

  5. POJ 3133 Manhattan Wiring (插头DP)

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1110   Accepted: 634 D ...

  6. POJ 3133 Manhattan Wiring(限制匹配的插头DP)

    Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1921   Accepted: 1130 ...

  7. POJ3133(插头dp)

    传送门:http://poj.org/problem?id=3133 Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K       ...

  8. [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识--这真的是一种很锻炼人的题型-- 每一道题的状态都不一样 ...

  9. [LA3620]Manhattan Wiring

    [LA3620]Manhattan Wiring 试题描述 输入 输出 输入示例 5 5 0 0 0 0 0 0 0 0 3 0 2 0 2 0 0 1 0 1 1 1 0 0 0 0 3 2 3 2 ...

最新文章

  1. 【第一道计算几何题】 UVA11178 Morley‘s Theorem (二维几何,旋转直线求求交点)
  2. csu 1985: 驱R符
  3. Java发送邮件正文带表格
  4. NOIP2018——总结油记
  5. 2019世界大学排名全新出炉!清华北大排名大幅下滑?
  6. opengl 教程(18) 漫反射光
  7. uv,top3访问次数
  8. linux文件系统基础知识
  9. javase转javaee(java web)
  10. 新闻管理系统(C#)
  11. 推进牛仔服装的高质量发展
  12. matlab中的对数函数,[matlab对数函数]对数函数运算法则是什么呢?
  13. 米家 智能 服务器,为什么一谈到智能家居 都是小米米家?
  14. librosa提取mel_fbank
  15. 编程大实践 数独破解 #Cilay #嵩天
  16. 精辟的人生格言,呵呵
  17. C/java 实现爱心
  18. 【Unity】判断视频是否播放完毕
  19. 数据同步工具之DataX实操
  20. 司新颖:当番茄遭遇鸡蛋

热门文章

  1. 面向对象中OOA, OOD 和OOP的区别
  2. Redis(三十一)-Redis夺命三问之缓存穿透缓存击穿缓存雪崩
  3. Java word转pdf(替换变量,转图片)
  4. eclipse for Java还是java ee
  5. Optitrack连接UE4
  6. 埋点tracker:前端数据埋点-方案设计思路梳理
  7. 关于银行的表内与表外业务
  8. DipTrace 4.1.0 x86 / x64原理图捕获软件
  9. 恶意手机广告软件如何清除?不用360等所谓杀毒防护软件。
  10. Android如何控制iPhone,王者荣耀安卓转苹果怎么操作 安卓转苹果操作方法