好久没写Dfs了,拿来练手。

WA了一次,没有判断中间的情况……

解法:先用Floyd传递闭包处理哪些点一定要在一起、哪些点一定不能在一起,六重循环。

然后深搜,res[i][j]表示1,i这个物品在j这一行的匹配物品列编号。

没有最优性剪枝,只有一堆可能性剪枝:

(1)对于和(1,i)这个点关系为“一定在一起”的点(j,k),一定要将res[i,j]设置为k。

(2)即将搜索res[i][j]为k的情况是否可能,那么条件就要是(j,k)这个点与(1,i)点的关系不是“不可能在一起”,而且(j,k)这个点与所有已经和(1,i)点匹配的点的关系不是“不可能在一起”。

参考代码:

program poj1683;//By_Thispoet
const maxn=10;
varx1,y1,x2,y2        :longint;i,j,m,n,p,q,test   :longint;map                :array[0..maxn,0..maxn,0..maxn,0..maxn]of integer;res                :array[0..maxn,0..maxn]of integer;v                  :array[0..maxn,0..maxn]of boolean;ch                 :array[0..maxn,0..maxn]of char;c,cc               :char;flag               :boolean;procedure printf();
beginfor i:=1 to m do beginfor j:=1 to n do write(ch[j,res[i,j]]);writeln;end;writeln;
end;procedure dfs(code,pos:longint);var i,j,k:longint;beginif code=n+1 then beginprintf();flag:=true;exit;end;if res[pos,code]<>-1 then beginif pos+1<=m then dfs(code,pos+1) else dfs(code+1,1);exit;end;if flag then exit;for i:=1 to m do if (not v[code][i])and(map[1,pos,code,i]<>2) then beginfor j:=code+1 to n do for k:=1 to m do if (map[code,i,j,k]=1)and(res[pos,j]<>-1)then beginflag:=true;break;end;for j:=1 to code-1 do if map[code,i,j,res[pos,j]]=2 then beginflag:=true;break;end;if flag then begin flag:=false; continue; end;v[code][i]:=true;res[pos,code]:=i;for j:=code+1 to n do for k:=1 to m do if (map[code,i,j,k]=1) then beginres[pos,j]:=k;v[j,k]:=true;break;end;if pos+1<=m then dfs(code,pos+1) else dfs(code+1,1);if flag then exit;for j:=code+1 to n do for k:=1 to m do if map[code,i,j,k]=1 then beginres[pos,j]:=-1;v[j,k]:=false;break;end;v[code][i]:=false;res[pos,code]:=-1;end;
end;beginreadln(test);while test>0 do beginreadln(n,m);filldword(map,sizeof(map)shr 2,0);fillchar(res,sizeof(res),255);for i:=1 to n do beginfor j:=1 to m do read(ch[i][j]);readln;end;flag:=false;readln(x1,y1,cc,c,cc,x2,y2);while not (x1=0) do beginif c='R' then beginmap[x1,y1,x2,y2]:=1;map[x2,y2,x1,y1]:=1;end else beginmap[x1,y1,x2,y2]:=2;map[x2,y2,x1,y1]:=2;end;readln(x1,y1,cc,c,cc,x2,y2);end;for p:=1 to n do for q:=1 to m dofor x1:=1 to n do for y1:=1 to m dofor x2:=1 to n do for y2:=1 to m dobeginif (map[x1,y1,p,q]=1)and(map[x2,y2,p,q]=2) then map[x1,y1,x2,y2]:=2;if (map[x1,y1,p,q]=2)and(map[x2,y2,p,q]=1) then map[x1,y1,x2,y2]:=2;if (map[x1,y1,p,q]=1)and(map[x2,y2,p,q]=1) then map[x1,y1,x2,y2]:=1;end;fillchar(v,sizeof(v),0);for i:=1 to m do res[i,1]:=i;for i:=1 to m do for p:=2 to n do for q:=1 to m doif map[1,i,p,q]=1 then begin res[i,p]:=q; v[p,q]:=true; end;dfs(1,1);dec(test);end;
end.

转载于:https://www.cnblogs.com/Thispoet/archive/2011/11/01/2232041.html

POJ1683 Puzzlestan ——Floyd传递闭包+Dfs相关推荐

  1. POJ 3660 Cow ContestCow(Floyd传递闭包)题解

    题意:给出m个关系,问你能确定机头牛的排名 思路:要确定排名那必须要把他和其他n-1头牛比过才行,所以Floyd传递闭包,如果赢的+输的有n-1就能确定排名. 代码: #include<cstd ...

  2. POJ 3275 Ranking the Cows (floyd传递闭包)

    Ranking the Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2248   Accepted: 1045 ...

  3. POJ - 1094 Sorting It All Out(拓扑排序+floyd传递闭包)

    题目链接:点击查看 题目大意:给出N个点以及M个比较关系,问在第几个数字可以确定出唯一的序列,或者判断出矛盾的序列,或者最后也无法确定出一个唯一的序列 题目分析:关于这个题目可以直接分类讨论,可以直接 ...

  4. 【POJ - 2594】Treasure Exploration(floyd传递闭包 + 最小路径覆盖,图论)

    题干: Have you ever read any book about treasure exploration? Have you ever see any film about treasur ...

  5. CIA3 NOI接站(tarjan缩环+Floyd传递闭包+可相交最小路径覆盖)

    可以发现,题目求得就是一个可相交最小路径覆盖,但是有环.所以我们先用tarjan把环都缩掉,然后Floyd传递闭包,求二分图最大匹配,答案就是scc-ans. #include <cstdio& ...

  6. 【BZOJ5335】【TJOI2018】—智力竞赛(floyd传递闭包+二分图匹配)

    传送门 可以二分变成直接求最大链覆盖,因为可以重复经过一个点 floydfloydfloyd传递闭包就可以了 #include<bits/stdc++.h> using namespace ...

  7. H - Cow Contest POJ - 3660(Floyd 传递闭包)

    H - Cow Contest POJ - 3660 题意: 有 n 头牛比赛,边 1 -> 2 代表 1 能赢 2 ,给你 m 条边,问能确定出多少头牛的名次? 思路: 如果 1->2 ...

  8. uva 247(floyd传递闭包)

    为什么,逗号后面,还有空格........ #include <iostream> #include <cstring> #include <algorithm> ...

  9. 【图论专题】Floyd算法及其扩展应用

    Floyd的拓展应用: 任意两点最短路 传递闭包 找最小环 恰好经过k条边的最短路(倍增) 题目列表: 题目 算法 AcWing 1125. 牛的旅行 任意两点最短路Floyd AcWing 343. ...

最新文章

  1. a href=# 与javascript:void(0)的区别
  2. Linux(服务器编程):25---epoll复用技术实现统一处理信号事件源
  3. indy9 indy10 MD5 实现方法
  4. python从入门到精通-Python从入门到精通,跟着《这本书》学就够了?
  5. failed building wheel for termcolor_【零基础学Python】For循环和RANGE()函数
  6. SIGPIPE 13 和其他信号的对照表
  7. 跑赢业务的同时如何实现技术成长? | 凌云时刻
  8. [转]余弦cos计算相似度
  9. FFmpeg进行推流的两种方法
  10. java逻辑与或非_Java基础——逻辑运算符与或非
  11. 【演讲之路】钱塘TMC互联网思维分享会
  12. linux查看串口信息tty*
  13. 骨传导耳机是什么意思?骨传导耳机工作原理是什么
  14. Python学习初阶:Python基本介绍及常用数据类型
  15. 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  16. 设计模式3-软件设计原则
  17. 计算机的键盘分别代表什么,键盘中的三个指示灯分别代表什么意思
  18. 6580 8.1 mtp模式,查看手机容量大小修改
  19. 香港在线下和线上以科技呈献缤纷耀眼的圣诞
  20. JAVA Web学习笔记15 mybatis之查看详情 条件查询

热门文章

  1. 一个好用的浏览器暗色浏览插件 Dark Reader
  2. iOS开发UI篇—字典转模型
  3. 本地搭建Dubbo监控中心的安装步骤
  4. JS 常用字符串数组遍历函数方法整理
  5. emacs的使用方法
  6. java 注解默认值
  7. Hadoop(5)-Hive
  8. 感动要哭 撸了一个半小时的重载预算符高精
  9. SQL Server代理(11/12):维护计划作业
  10. python学习笔记(七)