【POJ3133】Manhattan Wiring 插头DP
原题走这里
看起来就很难的一道题
本题存在一个小陷阱,它看起来像是单回路模型(毕竟是求路径),然而它其实是多回路模型,或者说可以用多回路模型做。
这道题求的是最短距离,那么这就意味着如果出现了多出来的一个回路,那么它就会因为带来了额外的距离而被舍去。
于是乎,我们就可以用多回路也就是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相关推荐
- [POJ3133]Manhattan Wiring 插头dp
[POJ3133]Manhattan Wiring 插头dp 原题POJ3133 题意:N*M有障碍矩阵,0可通过,1为障碍,两个2,两个3,求连接两个2和连接两个3的两条不相交路径长度和的最小值(1 ...
- POJ 3133 Manhattan Wiring(插头DP)
题目链接:http://poj.org/problem?id=3133 题意:n*m的格子中有两个2和两个3,其余是空白或障碍.找出两条路径分别连接2和3,不经过障碍且不相交.使得两条路径长度和最短? ...
- [Poj3133]Manhattan Wiring (插头DP)
Description 题目大意:给你个N x M(1≤N, M≤9)的矩阵,0表示空地,1表示墙壁,2和3表示两对关键点.现在要求在两对关键点之间建立两条路径,其中两条路径不可相交或者自交(就是重复 ...
- poj3133 Manhattan Wiring
Manhattan Wiring Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 2016 Accepted: 1162 ...
- POJ 3133 Manhattan Wiring (插头DP)
Manhattan Wiring Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 1110 Accepted: 634 D ...
- POJ 3133 Manhattan Wiring(限制匹配的插头DP)
Manhattan Wiring Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 1921 Accepted: 1130 ...
- POJ3133(插头dp)
传送门:http://poj.org/problem?id=3133 Manhattan Wiring Time Limit: 5000MS Memory Limit: 65536K ...
- [入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识--这真的是一种很锻炼人的题型-- 每一道题的状态都不一样 ...
- [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 ...
最新文章
- 【第一道计算几何题】 UVA11178 Morley‘s Theorem (二维几何,旋转直线求求交点)
- csu 1985: 驱R符
- Java发送邮件正文带表格
- NOIP2018——总结油记
- 2019世界大学排名全新出炉!清华北大排名大幅下滑?
- opengl 教程(18) 漫反射光
- uv,top3访问次数
- linux文件系统基础知识
- javase转javaee(java web)
- 新闻管理系统(C#)
- 推进牛仔服装的高质量发展
- matlab中的对数函数,[matlab对数函数]对数函数运算法则是什么呢?
- 米家 智能 服务器,为什么一谈到智能家居 都是小米米家?
- librosa提取mel_fbank
- 编程大实践 数独破解 #Cilay #嵩天
- 精辟的人生格言,呵呵
- C/java 实现爱心
- 【Unity】判断视频是否播放完毕
- 数据同步工具之DataX实操
- 司新颖:当番茄遭遇鸡蛋