﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Mato is No.1-随笔分类-搜索</title><link>http://www.cppblog.com/MatoNo1/category/16553.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Sat, 20 Oct 2012 00:12:32 GMT</lastBuildDate><pubDate>Sat, 20 Oct 2012 00:12:32 GMT</pubDate><ttl>60</ttl><item><title>【AHOI2013复仇】SCOI2005的两道搜索题总结</title><link>http://www.cppblog.com/MatoNo1/archive/2012/10/19/193523.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Fri, 19 Oct 2012 13:48:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/10/19/193523.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/193523.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/10/19/193523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/193523.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/193523.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [SCOI2005]栅栏 [SCOI2005]骑士精神 DFS优化类题目的代表。【栅栏】方法一：将N块目标木板的长度递增排序，然后，从前到后搜索每块目标木板从哪块原料中得到，直到所有的原料都不够用为止。优化：（1）启发函数：从目前的每块原料中，尝试依次切出目前剩余的最小长度的目标木板，则各块原料切出的块数之和就是一个乐观估计（比如剩余3块原料的长度为10、12、19，剩余的目标木板为3、4、5、6...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2012/10/19/193523.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/193523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-10-19 21:48 <a href="http://www.cppblog.com/MatoNo1/archive/2012/10/19/193523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】SCOI2008 天平</title><link>http://www.cppblog.com/MatoNo1/archive/2012/09/25/191996.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Tue, 25 Sep 2012 13:26:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/09/25/191996.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/191996.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/09/25/191996.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/191996.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/191996.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原题地址本题就是，有N个变量，其取值只可能有三种：1、2、3。现在已知它们之间的一些大小关系，求有多少对变量(I, J)满足(I的值+J的值)一定&gt;或=或&lt;(A的值+B的值)，A、B是指定的两个变量，且I、J、A、B互不相同。首先，对于值相等的变量，直接建出无向图，按连通块缩点，再考虑大于/小于关系，如果I的值大于J则在I所在连通块与J所在连通块之间连一条有向边（从I到J）&#8230...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2012/09/25/191996.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/191996.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-09-25 21:26 <a href="http://www.cppblog.com/MatoNo1/archive/2012/09/25/191996.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】从一道题来看DFS及其优化的一般步骤和数组分层问题</title><link>http://www.cppblog.com/MatoNo1/archive/2012/09/23/191708.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 23 Sep 2012 07:16:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/09/23/191708.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/191708.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/09/23/191708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/191708.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/191708.html</trackback:ping><description><![CDATA[<a title="RQNOJ187 巧置挡板" href="http://www.rqnoj.cn/Problem_187.html">RQNOJ187 巧置挡板</a><br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />【背景（神犇不要囧视，3x）】<br />本沙茶最近开始猛攻搜索、近似、随机等算法，目标是A掉AHOI2012的后3题（在哪跌倒就从哪爬起）。昨天晚上找到这题，发现是搜索，于是开始捉&#8230;&#8230;结果被折腾了一晚上加一上午才A掉，不过，看在这题可以系统性的反映DFS优化的一般步骤，忍了&#8230;&#8230;另外，这题是本沙茶在RQNOJ上通过的第400题&#8230;&#8230;回想起通过第300题的时候已经是近三年半之前了&#8230;&#8230;真颓废啊&#8230;&#8230;<br />&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />普通DFS（不加迭代）的优化方法主要有：<br />（1）可行性剪枝，如果遇到已经无法产生可行解的情况就剪枝，有时候，可行性剪枝也可以指在搜索过程中对不合法情况的剔除；<br />（2）最优性剪枝：如果遇到已经无法产生比目前得到的最优解还要优的解的情况就剪枝，这其中包括启发式最优性剪枝（即分支限界），对目前解的进展情况作乐观估计，如果估计值都不能超越目前的最优解，则剪枝；<br />（3）通过改变搜索顺序，尽早得出较优解，从而为后面的剪枝提供余地；<br />（4）通过预处理等手段，提前得到启发值或者较优解，为后面的剪枝提供余地；<br /><br />一般步骤：<br />（1）预处理，当然是写在最前面，在搜索前得到启发值等东东；<br />（2）搜索过程中，先写最优性剪枝（包括已经到达搜索终点了，也应该判断一下，提前排除不是最优解的情况）；<br />（3）再判定搜索终点，如果到了，也不要马上更新解，而是要判定这个解是否符合要求，再更新；<br />（4）若未到终点，再写可行性剪枝；<br />（5）最后写搜索过程，包括需要改变搜索顺序的情况。<br /><br />注意事项：<span style="color: red"><strong>数组的分层问题。</strong></span><br />这是一个很严重的问题，因为分层出错很可能会导致一些很怪的错误出现，难以发现。在<a title="搜索题的调试技巧" href="http://www.cppblog.com/MatoNo1/archive/2012/03/22/168637.html">搜索题的调试技巧</a>这一篇中，已经提到了这个问题，本题又涉及到了。<br />一般来说，搜索过程中使用的数组（包括变量，可以视为零维数组）可以分为以下三类：<br />（1）在搜索过程中，只会引用其值，不会修改的数组（比如预处理中得到的那些东东），相当于常量；<br />（2）在搜索过程中，会改变其值，但在搜索完毕后能改回原值的数组；<br />（3）在搜索过程中，会改变其值，且在搜索完毕后也改不回原值的数组。<br />对于（1）（2）类数组，不需分层，但对于第（3）类数组一定要分层。这是因为这些数组在多层搜索中都需要修改，而且搜索完了也改不回来，如果不分层，则当后面的搜索完毕以后，要继续搜索前面的，引用的将是后面的值，就会出错。<br />对于第（3）类数组，有的已经&#8220;自然分层&#8221;（每层搜索修改的元素都不一样），比如本题代码中的R[][]、C[][]。然而有的并没有自然分层，比如本题的len、pos[]、tmp[]等，因此对于这些数组，需要再加一维，对于不同层使用该维不同的元素即可。<br /><br />下面是本题的算法：<br />使用DFS搜索每个位置的挡板是否需要放。搜索时，先搜竖的再搜横的，由于题目要求每个连通块都必须是矩形，因此对于竖的，如果该位置的上方两个相邻位置的横的没有全放（包括只放了一个），则该位置的竖的放不放取决于其上一行对应位置的竖的有没有放（第一行除外），如果两个横的都放了，则这里的竖的既可以放也可以不放（先搜不放的情况）。当然，一行的两个1之间必须至少有一个竖的，这是可行性限制。在搜横的的时候，按照该行所放的竖的，分成若干段，显然每一段要么下面都用横的封上，要么一个都不封上。其中，如果该段所在的连通块里面有1，且下一行对应位置也有1，则必须封上；若该段所在连通块里面没有1，则不能封上（因为不能有一个连通块里一个1都没有），否则可以自由选择封还是不封（当然也是先搜不封的）。这样一直搜到最后一行的竖的后，还要判断最后一行有没有连通块里没1，若没有，则为一个可行解。启发式优化：设D[i]为第i行及以后至少要几个挡板（若某行有K个1，则至少需要(K-1)个竖的；若某列有K个1，则至少需要(K-1)个横的，累加起来即可，显然这是乐观估计），D[i]可以预处理出来，当做启发值。<br /><br />代码：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">35</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;m,&nbsp;D[MAXN],&nbsp;len[MAXN],&nbsp;pos[MAXN][MAXN],&nbsp;tmp[MAXN][MAXN],&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;A[MAXN][MAXN],&nbsp;C[MAXN][MAXN],&nbsp;R[MAXN][MAXN],&nbsp;S[MAXN][MAXN][MAXN][MAXN];<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dfs0(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sum,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;FF);<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;re(j,&nbsp;m)&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">x);&nbsp;A[i][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;re(j,&nbsp;m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S[i][j][i][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(k,&nbsp;i</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;n)&nbsp;S[i][j][k][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[k][j]&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;S[i][j][k&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(k,&nbsp;j</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;m)&nbsp;S[i][j][i][k]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[i][k]&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;S[i][j][i][k&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(k,&nbsp;i</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;n)&nbsp;re2(k0,&nbsp;j</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;m)&nbsp;S[i][j][k][k0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;A[k][k0]&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;S[i][j][k&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][k0]&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;S[i][j][k][k0&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(j,&nbsp;i,&nbsp;n)&nbsp;{sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;re(k,&nbsp;m)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[j][k])&nbsp;sum</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum)&nbsp;D[i]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;sum&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(k,&nbsp;m)&nbsp;{sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;re2(j,&nbsp;i,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[j][k])&nbsp;sum</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum)&nbsp;D[i]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;sum&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dfs1(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sum)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;D[No&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;res)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(v&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;len[No]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;dfs0(No&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;sum,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(tmp[No][v]&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;dfs1(No,&nbsp;v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;sum);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;r,&nbsp;sum0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(v)&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pos[No][v&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(v&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;len[No])&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pos[No][v];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re3(j,&nbsp;l,&nbsp;r)&nbsp;R[No][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;dfs1(No,&nbsp;v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;sum);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re3(j,&nbsp;l,&nbsp;r)&nbsp;{R[No][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;sum0</span><span style="color: #000000">++</span><span style="color: #000000">;}&nbsp;dfs1(No,&nbsp;v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;sum0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dfs0(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sum,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;FF)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;D[No&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;res)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;FF0;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[No][v])&nbsp;{</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">FF)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;FF0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;FF0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;FF;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(v&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(No&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len[No]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;re(i,&nbsp;m</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(C[No][i])&nbsp;pos[No][len[No]</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;r,&nbsp;x;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;FFF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;len[No])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i)&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pos[No][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;len[No])&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pos[No][i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;rre(j,&nbsp;No)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(R[j][l])&nbsp;{x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">S[x][l][No][r])&nbsp;{FFF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(FFF)&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len[No]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;re(i,&nbsp;m</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(C[No][i])&nbsp;pos[No][len[No]</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;r,&nbsp;x,&nbsp;sum0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;len[No])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i)&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pos[No][i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;len[No])&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pos[No][i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;rre(j,&nbsp;No)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(R[j][l])&nbsp;{x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(S[x][l][No][r]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;S[No&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][l][No&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][r])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp[No][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;&nbsp;re3(j,&nbsp;l,&nbsp;r)&nbsp;{sum0</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;R[No][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(S[x][l][No][r])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp[No][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;re3(j,&nbsp;l,&nbsp;r)&nbsp;R[No][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp[No][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;re3(j,&nbsp;l,&nbsp;r)&nbsp;R[No][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs1(No,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;sum0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(No&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">R[No&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][v]&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">R[No&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">]))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(C[No&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">][v])&nbsp;{C[No][v]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;dfs0(No,&nbsp;v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{C[No][v]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;dfs0(No,&nbsp;v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;sum,&nbsp;FF0);}<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C[No][v]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;dfs0(No,&nbsp;v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;sum,&nbsp;FF0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C[No][v]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;dfs0(No,&nbsp;v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;dfs0(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /></span></div><br /> <img src ="http://www.cppblog.com/MatoNo1/aggbug/191708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-09-23 15:16 <a href="http://www.cppblog.com/MatoNo1/archive/2012/09/23/191708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【AHOI2013复仇】s-t第K短简单路问题</title><link>http://www.cppblog.com/MatoNo1/archive/2012/09/23/191705.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 23 Sep 2012 06:28:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/09/23/191705.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/191705.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/09/23/191705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/191705.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/191705.html</trackback:ping><description><![CDATA[<div><a title="[SCOI2007 kshort]" href="http://www.lydsy.com/JudgeOnline/problem.php?id=1073">[SCOI2007 kshort]</a><br />求图的s-t第K短简单路问题，若有长度相同的，字典序小的优先。<br /><br />首先，由于是简单路，所以<a title="A*" href="http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html">A*</a>是不能做的，因为有可能有两条s-i（i为某个中间点）路P1和P2，P1比P2短，但由于P1到达的顶点与P2不同，导致最终沿P1到达t的路径长度长于沿P2到达t的（甚至有可能沿P1根本到不了t）。然后，如果直接用DFS，由于要求的是第K优解，而不是最优解，所以不能使用最优性剪枝（包括分支限界），因此专门为最优性剪枝服务的&#8220;改变搜索顺序&#8221;技巧也不能使用了，因此，能够使用的只有可行性剪枝，而本题的数据范围使得这种算法必然TLE。<br /><br />正解是一种由迭代加深思想扩展得到的&#8220;<span style="color: red"><strong>迭代变优</strong></span>&#8221;DFS。设置一个路径长度上限Z，搜索s到t的所有简单路，在搜索过程中，遇到长度大于Z的路径就停止（剪枝），然后，若得到路径不足K条，则增加Z的值，重新开始搜索，直到得到的路径总数大于等于K条为止。这里可以进行启发式的优化，设g[i]为点i到t的最短路长度，则搜索过程中，假设目前搜到点i，则（目前路径长度+g[i]）是对整条路径最短长度的乐观估计，如果这个值超过了Z，就可以剪枝，但在剪枝之前要记下这个超过了Z的启发值，取其中最小的作为下一次迭代的Z值。那么对于字典序肿么办？可以在搜索过程中，强制先搜编号小的结点，这样得到的s-t路径必然是字典序递增的。另外只要求出第K条路径，搜索就可以终止，因为容易证明，题目要求的第K短的路径一定已经求出来了（只不过不一定是最后一条而已），找到即可。此外，在搜索过程中不要忘了可行性剪枝，就是如果沿目前搜到的路径已经到不了t了，剪枝。<br /><br />&#8220;迭代变优&#8221;DFS，就是设置一个解的评价值的上限（最小值）或下限（最大值），在搜索过程中，如果实际评价值（或者启发值，如果可以加启发式优化的话）越过这个限制，则剪枝。在一次搜索后，如果没有得到符合要求的解，就将该限制值<span style="color: red"><strong>设为本次搜索过程中越界&#8220;越&#8221;得最近的那个值</strong></span>，重新开始搜索，直到找到所需要的解或者<span style="color: red"><strong>发现无解</strong></span>（如果一次搜索中没有发生越界，却仍然没有找到解）为止。其应用主要体现在两个方面：（1）搜索树过深甚至无限深，但所需求的那个解却不深的情况；（2）求第K优解的情况。<br /><br />代码： 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">algorithm</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n-1;&nbsp;i&gt;=0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=n;&nbsp;i&gt;0;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre2(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r-1;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;rre3(i,&nbsp;r,&nbsp;l)&nbsp;for&nbsp;(int&nbsp;i=r;&nbsp;i&gt;=l;&nbsp;i--)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">51</span><span style="color: #000000">,&nbsp;MAXK&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">201</span><span style="color: #000000">,&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3000</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;w,&nbsp;pre,&nbsp;next;<br />}&nbsp;E[MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAXN],&nbsp;E0[MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAXN];<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge0&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;w;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;(edge0&nbsp;e0)&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;{</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;b&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;e0.b;}<br />}&nbsp;_E[MAXM];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;m,&nbsp;s,&nbsp;t,&nbsp;K,&nbsp;dist[MAXN],&nbsp;Q[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Z,&nbsp;Z0,&nbsp;vst0[MAXN],&nbsp;_FL,&nbsp;len0,&nbsp;X00[MAXN],&nbsp;No,&nbsp;len[MAXK],&nbsp;X0[MAXK][MAXN],&nbsp;sum0[MAXK],&nbsp;reslen,&nbsp;res[MAXN];<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;vst[MAXN],&nbsp;res_ex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init_d()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;E[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;w)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;E[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E[m].w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;w;&nbsp;E[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[a].pre;&nbsp;E[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;E[E[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;<br />&nbsp;&nbsp;&nbsp;&nbsp;E0[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;E0[m].w&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;w;&nbsp;E0[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[b].pre;&nbsp;E0[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;E0[b].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;E0[E0[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m0;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m0,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">K,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">s,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">t);&nbsp;init_d();&nbsp;s</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;t</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m0)&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">_E[i].a,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">_E[i].b,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">_E[i].w);&nbsp;_E[i].a</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;_E[i].b</span><span style="color: #000000">--</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;sort(_E,&nbsp;_E&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;m0);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m0)&nbsp;add_edge(_E[i].a,&nbsp;_E[i].b,&nbsp;_E[i].w);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{vst[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;dist[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;}&nbsp;vst[t]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;dist[t]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;Q[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;y,&nbsp;d0,&nbsp;d1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">front&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;rear</span><span style="color: #000000">==</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">==</span><span style="color: #000000">rear</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;front</span><span style="color: #000000">==</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;:&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[front];&nbsp;d0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[x];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E0[x].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;x;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E0[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E0[p].b;&nbsp;d1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d0&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;E0[p].w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(d1&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;dist[y])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[y])&nbsp;{vst[y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;Q[rear</span><span style="color: #000000">==</span><span style="color: #000000">n&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;:&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;y;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dfs(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sum)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(x&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;t)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum&nbsp;</span><span style="color: #000000">&lt;=</span><span style="color: #000000">&nbsp;Z)&nbsp;{sum0[No]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sum;&nbsp;len[No]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;len0;&nbsp;re(i,&nbsp;len0)&nbsp;X0[No][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;X00[i];&nbsp;No</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(No&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;K)&nbsp;res_ex&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;Z0)&nbsp;Z0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;h0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;dist[x];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(h0&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;Z)&nbsp;{</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(h0&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;Z0)&nbsp;Z0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;h0;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst0[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">_FL;&nbsp;Q[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_x,&nbsp;_y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear;&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[front];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[_x].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;_x;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[p].b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[_y]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;vst0[_y]&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;_FL)&nbsp;{vst0[_y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_FL;&nbsp;Q[</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_y;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(vst0[t]&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;_FL)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[x].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;x;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">E[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;E[p].b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[_y])&nbsp;{vst[_y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;X00[len0</span><span style="color: #000000">++</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_y;&nbsp;dfs(_y,&nbsp;sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;E[p].w);&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(res_ex)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{len0</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;vst[_y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dist[s];&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;_FL&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Z0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;&nbsp;No&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;re(i,&nbsp;n)&nbsp;{vst[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;vst0[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst[s]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;len0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;X00[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s;&nbsp;dfs(s,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(res_ex)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;No0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;K&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;No0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;K)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(sum0[i]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;Z)&nbsp;{No0</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">No0)&nbsp;{reslen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;len[i];&nbsp;re(j,&nbsp;len[i])&nbsp;res[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;X0[i][j];}}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(Z0&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;INF)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{No0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;No;&nbsp;Z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Z0;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(res_ex)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re2(i,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;reslen)&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">-%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res[i]&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts(</span><span style="color: #000000">""</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;puts(</span><span style="color: #000000">"</span><span style="color: #000000">No</span><span style="color: #000000">"</span><span style="color: #000000">);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;solve();<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /><br /></span></div><br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/191705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-09-23 14:28 <a href="http://www.cppblog.com/MatoNo1/archive/2012/09/23/191705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搜索题的调试技巧以及一些附加内容</title><link>http://www.cppblog.com/MatoNo1/archive/2012/03/22/168637.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Thu, 22 Mar 2012 12:49:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/03/22/168637.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/168637.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/03/22/168637.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/168637.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/168637.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 【背景（神犇不要鄙视）】本沙茶在搜索题目的调试上已经挂过两次了（NOI2011的game用了2h+木有调出来，还耽误了继续想show的时间，结果被挡在了集训队门外；NOIP2011的mayan，用暴搜都调了2h+，木有调出来，结果惨挂，全国第200名，如果这题AC了就是全国前50名&#8230;&#8230;），为了防止在接下来的比赛中再在这里挂掉，本沙茶决定好好搞一下这个。【DFS的调试技巧】如...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2012/03/22/168637.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/168637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-03-22 20:49 <a href="http://www.cppblog.com/MatoNo1/archive/2012/03/22/168637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NOI2005 智慧珠游戏</title><link>http://www.cppblog.com/MatoNo1/archive/2011/07/20/151509.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Wed, 20 Jul 2011 15:07:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/07/20/151509.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/151509.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/07/20/151509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/151509.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/151509.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 【原题见这里】很明显的精确覆盖的模型，12个零件，再加上它们经过旋转、翻转后的不同形状，共60种，每种又可以放在不同的位置（只看最左上的那个珠子）一种零件的一种位置就是一行。列（限制）有两种：每个格子只能放一个（55列），以及每个零件（注意是每个零件，不是每种零件）只能用一次（12列），共67列。预先放的那些零件可以看成预先选中的行。然后DLX精确覆盖即可。下面是DLX精确覆盖的几个易疵点：（1）...&nbsp;&nbsp;<a href='http://www.cppblog.com/MatoNo1/archive/2011/07/20/151509.html'>阅读全文</a><img src ="http://www.cppblog.com/MatoNo1/aggbug/151509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-07-20 23:07 <a href="http://www.cppblog.com/MatoNo1/archive/2011/07/20/151509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于DLX重复覆盖的补充</title><link>http://www.cppblog.com/MatoNo1/archive/2011/07/20/151469.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Wed, 20 Jul 2011 04:28:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/07/20/151469.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/151469.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/07/20/151469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/151469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/151469.html</trackback:ping><description><![CDATA[<div>昨天在刷PKU1084的时候，调了很久，发现原来那样实现有缺陷。（原来的实现见<a title="这里" href="http://www.cppblog.com/MatoNo1/archive/2011/04/12/144071.html">这里</a>）<br /><br />在重复覆盖问题中，删去一整列的操作（delcol）是断开该列除了初始结点外的所有结点的左右链（delLR），这样，如果有一些行预先已被选中，则删去这一行（准确来说是对这一行所有结点执行delcol操作），这时就会出现问题，因为在删去这一行的最后一个结点的时候，其左、右链都指向其本身，此时就无法删掉这个结点。解决这一问题的办法是除了在矩阵中引入列头以外，还要引入行头（rowh），并且保证行头不删掉。这样在删掉一整行的时候就不会出问题了。但是，如果这样的话，需要在搜索过程中执行delcol操作前进行特判，保证不删掉行头结点（比如将行头结点的U、D域置为-1），并且，在求启发函数h()值的时候也要防止在行头处出现问题，可以将行头结点的行列号均置为0。<br /><br />而在精确覆盖问题中，删去一整列的操作是断开结点的上下链而不是左右链，因此在删去一整行时就不需要引入行头结点。<br /><br />下面是PKU1084的AC代码：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">60</span><span style="color: #000000">,&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">55</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;dlnode&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;c,&nbsp;U,&nbsp;D,&nbsp;L,&nbsp;R;<br />}&nbsp;d[(MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;(MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_n,&nbsp;n,&nbsp;m,&nbsp;nodes,&nbsp;rowh[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;cols[MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;B[</span><span style="color: #000000">5</span><span style="color: #000000">][</span><span style="color: #000000">5</span><span style="color: #000000">][</span><span style="color: #000000">4</span><span style="color: #000000">],&nbsp;res;<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;A[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;vst[MAXN];<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init_d()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;m)&nbsp;{d[i].U&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[i].D&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;&nbsp;d[i].L&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;d[i].R&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}&nbsp;d[</span><span style="color: #000000">0</span><span style="color: #000000">].L&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;d[m].R&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;nodes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;re1(i,&nbsp;n)&nbsp;{rowh[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">nodes;&nbsp;d[nodes].L&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[nodes].R&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nodes;&nbsp;d[nodes].U&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[nodes].D&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;m)&nbsp;cols[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_node(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;cols[c]</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;d[</span><span style="color: #000000">++</span><span style="color: #000000">nodes].r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r;&nbsp;d[nodes].c&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;d[nodes].U&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[c].U;&nbsp;d[nodes].D&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c;&nbsp;d[c].U&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nodes;&nbsp;d[d[nodes].U].D&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nodes;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rh&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rowh[r];&nbsp;d[nodes].L&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[rh].L;&nbsp;d[nodes].R&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rh;&nbsp;d[rh].L&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nodes;&nbsp;d[d[nodes].L].R&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nodes;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;delLR(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;d[d[x].L].R&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[x].R;&nbsp;d[d[x].R].L&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[x].L;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;delUD(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;d[d[x].U].D&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[x].D;&nbsp;d[d[x].D].U&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[x].U;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;resuLR(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;d[d[x].L].R&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[d[x].R].L&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;resuUD(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;d[d[x].U].D&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;d[d[x].D].U&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;delcol(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[x].D;&nbsp;i&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;x;&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[i].D)&nbsp;delLR(i);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;resucol(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[x].U;&nbsp;i&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;x;&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[i].U)&nbsp;resuLR(i);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;_n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(j,&nbsp;_n)&nbsp;{B[i][j][</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">x;&nbsp;B[i][j][</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;_n;&nbsp;B[i][j][</span><span style="color: #000000">2</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;_n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;B[i][j][</span><span style="color: #000000">3</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;_n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;_n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;_n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;_n)&nbsp;re(j,&nbsp;_n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;i)&nbsp;re(k,&nbsp;_n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(t,&nbsp;i</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_node(B[j][k&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;t][</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_node(B[j&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;t][k][</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_node(B[j&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;t][k&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i][</span><span style="color: #000000">2</span><span style="color: #000000">],&nbsp;x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_node(B[j&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;i][k&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;t][</span><span style="color: #000000">3</span><span style="color: #000000">],&nbsp;x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rh;<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(A[i])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rh&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rowh[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">d[rh].R;&nbsp;j&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;rh;&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">d[j].R)&nbsp;delcol(j);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;h()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;m)&nbsp;vst[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[</span><span style="color: #000000">0</span><span style="color: #000000">].R;&nbsp;i;&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[i].R)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[i])&nbsp;{z</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;vst[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">d[i].D;&nbsp;j&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;i;&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">d[j].D)&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;k</span><span style="color: #000000">=</span><span style="color: #000000">d[j].R;&nbsp;k&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;j;&nbsp;k</span><span style="color: #000000">=</span><span style="color: #000000">d[k].R)&nbsp;vst[d[k].c]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;z;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dfs(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;dep)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;h0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;h();&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dep&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;h0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;res)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">h0)&nbsp;{res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dep;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mins&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF,&nbsp;c0;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[</span><span style="color: #000000">0</span><span style="color: #000000">].R;&nbsp;i;&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[i].R)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">cols[i])&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(cols[i]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;mins)&nbsp;{mins&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cols[i];&nbsp;c0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[c0].D;&nbsp;i&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;c0;&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">d[i].D)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delcol(i);&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">d[i].R;&nbsp;j&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;i;&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">d[j].R)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(d[j].U&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;delcol(j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(dep&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">d[i].L;&nbsp;j&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;i;&nbsp;j</span><span style="color: #000000">=</span><span style="color: #000000">d[j].L)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(d[j].U&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;resucol(j);&nbsp;resucol(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;tests,&nbsp;_n0,&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">tests);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(testno,&nbsp;tests)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">_n,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">_n0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_n&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;(_n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;re1(i,&nbsp;_n)&nbsp;m&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;i;&nbsp;init_d();&nbsp;re1(i,&nbsp;n)&nbsp;A[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;_n0)&nbsp;{scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">x);&nbsp;A[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/151469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-07-20 12:28 <a href="http://www.cppblog.com/MatoNo1/archive/2011/07/20/151469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用A*求图的单源单汇第K短路</title><link>http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 01 May 2011 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/145456.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/145456.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/145456.html</trackback:ping><description><![CDATA[【问题描述】<br>给出一个图G和指定的源点s、汇点t，求图中从点s到点t的第K短路。<br>【具体题目】<a title=PKU2449 href="http://poj.org/problem?id=2449">PKU2449</a>（注意：本题有一个猥琐之处：不允许空路径。也就是当s等于t时要将K值加1）<br>【算法】<br>本题有一种最朴素的办法：改造Dijkstra，一开始路径(s, 0)（这里设路径(i, l)表示从s到i的一条长度为l的路径）入队。然后，<span style="COLOR: red"><strong>每次取队中长度最短的路径</strong></span>，该路径(i, l)出队，可以证明，若这是终点为i的路径第x次出队，该路径一定是图中从s到i的第x短路（若x&gt;K则该路径已无用，舍弃）。然后从点i扩展，将扩展到的路径全部入队。这样直到终点为t的路径第K次出队即可。<br>该算法容易实现（借助priority_queue），但时间复杂度可能达到O(MK)，需要优化。<br>优化：容易发现该算法其实有A*的思想，或者说，该算法<span style="COLOR: red"><strong>其实是所有结点的估价函数h()值均为0的A*算法</strong></span>。为了优化此题，需要将h()值改大。显然，h(i)值可以设为<span style="COLOR: red"><strong>从i到t的最短路径长度</strong></span>（容易证明它是一致的），然后g(i)=目前结点代表的路径长度，f(i)=g(i)+h(i)，然后A*即可。<br><br>注意：更改路径条数应该在出队时更改，而不能在入队时更改，因为可能在该路径出队之前会有新的比它更短的路径入队。<br><br>代码（PKU2449）：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">queue</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;MAXN&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1500</span><span style="COLOR: #000000">,&nbsp;MAXM&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">150000</span><span style="COLOR: #000000">,&nbsp;INF&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">0U</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;edge&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;kk,&nbsp;len,&nbsp;next;<br>}&nbsp;ed[MAXM],&nbsp;ed2[MAXM];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n,&nbsp;m,&nbsp;s,&nbsp;t,&nbsp;k_,&nbsp;hd[MAXN],&nbsp;tl[MAXN],&nbsp;hd2[MAXN],&nbsp;tl2[MAXN],&nbsp;h[MAXN],&nbsp;q[MAXN&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">],&nbsp;No[MAXN],&nbsp;res&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;vst[MAXN];<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;qnode&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,&nbsp;g;<br>};<br>typedef&nbsp;priority_queue&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">qnode,&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">qnode</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;pq;<br>pq&nbsp;z;<br></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;(qnode&nbsp;q1,&nbsp;qnode&nbsp;q2)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;q1.g&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;h[q1.i]&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;q2.g&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;h[q2.i];<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;init()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a0,&nbsp;b0,&nbsp;l0;<br>&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m);<br>&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;hd[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tl[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;hd2[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tl2[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a0,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b0,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">l0);&nbsp;a0</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;&nbsp;b0</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ed[i].kk&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;b0;&nbsp;ed[i].len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;l0;&nbsp;ed[i].next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(hd[a0]&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;hd[a0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tl[a0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;tl[a0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ed[tl[a0]].next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ed2[i].kk&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a0;&nbsp;ed2[i].len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;l0;&nbsp;ed2[i].next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(hd2[b0]&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;hd2[b0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;tl2[b0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;tl2[b0]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ed2[tl2[b0]].next&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">s,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">t,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">k_);&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">s;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">t;&nbsp;k_&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;s&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;t;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;prepare()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{h[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;INF;&nbsp;vst[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;}&nbsp;h[t]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;vst[t]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;q[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;t;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,&nbsp;h0,&nbsp;j,&nbsp;h1;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;front</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;rear</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">front&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;rear&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;front&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;rear&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;front&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;n&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;front&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;:&nbsp;front</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;q[front];&nbsp;h0&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;h[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">hd2[i];&nbsp;p&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ed2[p].next)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ed2[p].kk;&nbsp;h1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;h0&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ed2[p].len;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(h1&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;h[j])&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h[j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;h1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">vst[j])&nbsp;{vst[j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rear&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;n)&nbsp;q[rear&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;j;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;q[</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">rear]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;j;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;solve()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;qnode&nbsp;q0;&nbsp;q0.i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s;&nbsp;q0.g&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;z.push(q0);<br>&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;No[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,&nbsp;d0,&nbsp;j,&nbsp;d1;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">z.empty())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;z.top().i;&nbsp;d0&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;z.top().g;&nbsp;z.pop();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(No[i]&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;k_)&nbsp;</span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;No[i]</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;t&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;No[i]&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;k_)&nbsp;{res&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d0;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">hd[i];&nbsp;p&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;p</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ed[p].next)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ed[p].kk;&nbsp;d1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d0&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ed[p].len;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q0.i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;j;&nbsp;q0.g&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d1;&nbsp;z.push(q0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;pri()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;res);<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;init();<br>&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br>&nbsp;&nbsp;&nbsp;&nbsp;solve();<br>&nbsp;&nbsp;&nbsp;&nbsp;pri();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br></span></div>
<img src ="http://www.cppblog.com/MatoNo1/aggbug/145456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-05-01 15:25 <a href="http://www.cppblog.com/MatoNo1/archive/2011/05/01/145456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RQNOJ P89，DLX重复覆盖……终于AC了</title><link>http://www.cppblog.com/MatoNo1/archive/2011/04/12/144071.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Tue, 12 Apr 2011 14:27:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/04/12/144071.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/144071.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/04/12/144071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/144071.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/144071.html</trackback:ping><description><![CDATA[<p>放了快2个月了&#8230;&#8230;（准确来说放了2年了，本沙茶从2年前就开始捉这道猥琐题&#8230;&#8230;）<br>DLX重复覆盖的几点说明：<br>（1）必须有启发函数优化，否则TLE；<br>（2）不需要二分下界，只要将目前f值（f=g+h，即实际深度加上启发函数值）与目前求得的最优解比较即可，f&gt;=最优解即剪枝；<br>（3）删一整列（delcol）操作时，可以从任意一个结点开始删（不一定要向精确覆盖那样非要从列头开始），但是，开始的那个结点不删！恢复（resucol）时也不恢复开始的那个结点！这是为了在接下来的横向遍历中不受影响。由于不删开始结点，所以在将最优列删除时，需要循环一次删除一次，恢复一次。<br><br>代码：（RQNOJ P89）</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iostream</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;std;<br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;MAXN&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">61</span><span style="COLOR: #000000">,&nbsp;MAXM&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">61</span><span style="COLOR: #000000">,&nbsp;INF&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">0U</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;DLnode&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;r,&nbsp;c,&nbsp;U,&nbsp;D,&nbsp;L,&nbsp;R;<br>}&nbsp;d[MAXN&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;MAXM];<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n,&nbsp;m,&nbsp;nodes,&nbsp;rowh[MAXN],&nbsp;cols[MAXM],&nbsp;res&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;INF;<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;init_d()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;m)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[i].r&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;d[i].c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;d[i].U&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[i].D&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;&nbsp;d[i].L&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;d[i].R&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;d[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].L&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m;&nbsp;d[m].R&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(rowh,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;n&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);&nbsp;memset(cols,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;m&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);&nbsp;nodes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;add_node(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;r,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;d[nodes].r&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;r;&nbsp;d[nodes].c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;c;&nbsp;d[nodes].U&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[c].U;&nbsp;d[nodes].D&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;c;&nbsp;d[c].U&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;nodes;&nbsp;d[d[nodes].U].D&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;nodes;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;rh&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rowh[r];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rh)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[nodes].L&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[rh].L;&nbsp;d[nodes].R&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rh;&nbsp;d[rh].L&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;nodes;&nbsp;d[d[nodes].L].R&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;nodes;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;d[nodes].L&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[nodes].R&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rowh[r]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;nodes;<br>&nbsp;&nbsp;&nbsp;&nbsp;cols[c]</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;&nbsp;nodes</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;init()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n);<br>&nbsp;&nbsp;&nbsp;&nbsp;init_d();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k,&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;re1(i,&nbsp;n)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">k);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(j,&nbsp;k)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">x);&nbsp;add_node(i,&nbsp;x);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;delUD(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;d[d[x].U].D&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[x].D;&nbsp;d[d[x].D].U&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[x].U;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;resuUD(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;d[d[x].U].D&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[d[x].D].U&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;x;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;delLR(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;d[d[x].L].R&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[x].R;&nbsp;d[d[x].R].L&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[x].L;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;resuLR(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;d[d[x].L].R&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[d[x].R].L&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;x;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;delcol(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[c].D;&nbsp;i&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;c;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[i].D)&nbsp;delLR(i);<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;resucol(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[c].U;&nbsp;i&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;c;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[i].U)&nbsp;resuLR(i);<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;h()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;vst[MAXM];&nbsp;memset(vst,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;m&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;z&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].R;&nbsp;i;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[i].R)&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">vst[i])&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;z</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[i].D;&nbsp;j&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;i;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[j].D)&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[j].R;&nbsp;k&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;j;&nbsp;k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[k].R)&nbsp;vst[d[k].c]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;z;<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;dfs(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;v)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(v&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;h()&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;res)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">d[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].R)&nbsp;{res&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;min&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;INF,&nbsp;x;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].R;&nbsp;i;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[i].R)&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(cols[i]&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;min)&nbsp;{min&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cols[i];&nbsp;x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[x].D;&nbsp;i&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;x;&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[i].D)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delcol(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[i].R;&nbsp;j&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;i;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[j].R)&nbsp;delcol(j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(v&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[i].L;&nbsp;j&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;i;&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d[j].L)&nbsp;resucol(j);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resucol(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;pri()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;res);<br>}<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;init();<br>&nbsp;&nbsp;&nbsp;&nbsp;dfs(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pri();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br></span></div>
<br>总结：DLX精确覆盖和重复覆盖其实是有大用的，很多搜索问题都可以转化为这两种问题，效率奇高无比，且写起来也很容易（只是在建模的时候可能有点猥琐，下面的模板，和网络流一样，10min的事），至于NOIP2009引出的数独系列问题，精确覆盖可以直接秒杀。<br>
<img src ="http://www.cppblog.com/MatoNo1/aggbug/144071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-04-12 22:27 <a href="http://www.cppblog.com/MatoNo1/archive/2011/04/12/144071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>