﻿<?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++博客-小阮的菜田-随笔分类-数据结构和算法</title><link>http://www.cppblog.com/jericho/category/15981.html</link><description>一个人一种命，各安天命吧。</description><language>zh-cn</language><lastBuildDate>Tue, 25 Oct 2011 20:29:31 GMT</lastBuildDate><pubDate>Tue, 25 Oct 2011 20:29:31 GMT</pubDate><ttl>60</ttl><item><title>[网络流]骑士共存问题</title><link>http://www.cppblog.com/jericho/archive/2011/10/17/158580.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Mon, 17 Oct 2011 14:03:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/10/17/158580.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/158580.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/10/17/158580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/158580.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/158580.html</trackback:ping><description><![CDATA[<div>【问题分析】<br /><br />二分图最大独立集，转化为二分图最大匹配，从而用最大流解决。<br /><br />【建模方法】<br /><br />首先把棋盘黑白染色，使相邻格子颜色不同。把所有可用的黑色格子看做二分图X集合中顶点，可用的白色格子看做Y集合顶点。建立附加源S汇T，从S向X集合中每个顶点连接一条容量为1的有向边，从Y集合中每个顶点向T连接一条容量为1的有向边。从每个可用的黑色格子向骑士一步能攻击到的可用的白色格子连接一条容量为无穷大的有向边。求出网络最大流，要求的结果就是可用格子的数量减去最大流量。<br /><br />【建模分析】<br /><br />用网络流的方法解决棋盘上的问题，一般都要对棋盘黑白染色，使之成为一个二分图。放尽可能多的不能互相攻击的骑士，就是一个二分图最大独立集问题。有关二分图最大独立集问题，更多讨论见《最小割模型在信息学竞赛中的应用》作者胡伯涛。<br /><br />该题规模比较大，需要用效率较高的网络最大流算法解决。<br /><br />基础概念:<br /><div>独立集： <p>&nbsp;&nbsp;&nbsp; 独立集是指图的顶点集的一个子集,该子集的导出子图不含边.如果一个独立集不是任何一个独立集的子集, 那么称这个独立集是一个极大独立集.一个图中包含顶点数目最多的独立集称为最大独立集。最大独立集 一定是极大独立集，但是极大独立集不一定是最大的独立集。</p> <p>支配集：</p> <p>&nbsp;&nbsp;&nbsp; 与独立集相对应的就是支配集，支配集也是图顶点集的一个子集，设S 是图G 的一个支配集，则对于图中的任意一个顶点u，要么属于集合s, 要么与s 中的顶点相邻。 在s中除去任何元素后s不再是支配集，则支配集s是极小支配集。称G的所有支配集中顶点个数最 少的支配集为最小支配集，最小支配集中的顶点个数成为支配数。</p> <p>最小点的覆盖：</p> <p>&nbsp;&nbsp;&nbsp; 最小点的覆盖也是图的顶点集的一个子集，如果我们选中一个点，则称这个点将以他为端点的所有边都覆盖了。将图中所有的边都覆盖所用顶点数最少，这个集合就是最小的点的覆盖。</p> <p><span style="color: #0010ff;">最大团：</span></p> <p><span style="color: #0010ff;">&nbsp;&nbsp;&nbsp; <span style="color: #040000;">图G的顶点的子集，设D是最大团，则D中任意两点相邻。若u，v是最大团，则u,v有边相连，其补图u,v没有边相连，所以图G的最大团=其补图的最大独立集。</span></span></p> <p><span style="color: #0010ff;"><span style="color: #040000;">一些性质：</span></span></p> <p><span style="color: #0010ff;"><span style="color: #040000;">最大独立集+最小覆盖集=V</span></span></p> <p><span style="color: #0010ff;"><span style="color: #040000;">最大团=补图的最大独立集</span></span></p> <p><span style="color: #0010ff;"><span style="color: #040000;">最小覆盖集=最大匹配</span></span></p></div></div><img src ="http://www.cppblog.com/jericho/aggbug/158580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-10-17 22:03 <a href="http://www.cppblog.com/jericho/archive/2011/10/17/158580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络流] 餐巾计划问题</title><link>http://www.cppblog.com/jericho/archive/2011/10/17/158579.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Mon, 17 Oct 2011 13:36:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/10/17/158579.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/158579.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/10/17/158579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/158579.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/158579.html</trackback:ping><description><![CDATA[<div>【问题分析】<br /><br />网络优化问题，用最小费用最大流解决。<br /><br />【建模方法】<br /><br />把每天分为二分图两个集合中的顶点Xi,Yi，建立附加源S汇T。<br /><br />1、从S向每个Xi连一条容量为ri，费用为0的有向边。<br />2、从每个Yi向T连一条容量为ri，费用为0的有向边。<br />3、从S向每个Yi连一条容量为无穷大，费用为p的有向边。<br />4、从每个Xi向Xi+1(i+1&lt;=N)连一条容量为无穷大，费用为0的有向边。<br />5、从每个Xi向Yi+m(i+m&lt;=N)连一条容量为无穷大，费用为f的有向边。<br />6、从每个Xi向Yi+n(i+n&lt;=N)连一条容量为无穷大，费用为s的有向边。<br /><br />求网络最小费用最大流，费用流值就是要求的最小总花费。<br /><br />【建模分析】<br /><br />这个问题的主要约束条件是每天的餐巾够用，而餐巾的来源可能是最新购买，也可能是前几天送洗，今天刚刚洗好的餐巾。每天用完的餐巾可以选择送到快洗部或慢洗部，或者留到下一天再处理。<br /><br />经过分析可以把每天要用的和用完的分离开处理，建模后就是二分图。二分图X集合中顶点Xi表示第i天用完的餐巾，其数量为ri，所以从S向Xi连接容量为ri的边作为限制。Y集合中每个点Yi则是第i天需要的餐巾，数量为ri，与T连接的边容量作为限制。每天用完的餐巾可以选择留到下一天（Xi-&gt;Xi+1），不需要花费，送到快洗部(Xi-&gt;Yi+m)，费用为f，送到慢洗部(Xi-&gt;Yi+n)，费用为s。每天需要的餐巾除了刚刚洗好的餐巾，还可能是新购买的(S-&gt;Yi)，费用为p。<br /><br />在网络上求出的最小费用最大流，满足了问题的约束条件（因为在这个图上最大流一定可以使与T连接的边全部满流，其他边只要有可行流就满足条件），而且还可以保证总费用最小，就是我们的优化目标。</div><img src ="http://www.cppblog.com/jericho/aggbug/158579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-10-17 21:36 <a href="http://www.cppblog.com/jericho/archive/2011/10/17/158579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ural 1297 最长回文子串(后缀数组)</title><link>http://www.cppblog.com/jericho/archive/2011/06/30/149862.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Thu, 30 Jun 2011 15:34:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/06/30/149862.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/149862.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/06/30/149862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/149862.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/149862.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 题意: 给定一个字符串, 求最长回文串分析: 求一个后缀和一个反过来写的后缀的最长公共前缀。具体的做法是：将整个字符串反过来写在原字符串后面，中间用一个特殊的字符隔开。问题变成求这个新的字符串的某两个后缀的最长公共前缀.Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlight...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2011/06/30/149862.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/149862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-06-30 23:34 <a href="http://www.cppblog.com/jericho/archive/2011/06/30/149862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPOJ 694 Distinct Substrings(不同子串个数, 后缀数组)</title><link>http://www.cppblog.com/jericho/archive/2011/06/30/149854.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Thu, 30 Jun 2011 13:19:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/06/30/149854.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/149854.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/06/30/149854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/149854.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/149854.html</trackback:ping><description><![CDATA[<p>题意: 给定一个字符串, 求不相同的子串的个数.<br /><br />分析:每个子串其实都是一个后缀的前缀, 原题等价于求: 所有后缀之间不相等前缀个数.<br /><br />所有后缀按照 suffix(sa[1]), suffix(sa[2]), suffix(sa[3]), ... suffix(sa[n])排序, <br /><br />每新加入一个后缀suffix(sa[k]), 就增加 n - sa[k] + 1 个前缀, 这些前缀中, 又有height[k]个与前一个后缀相同.<br /><br />所有只是增加个 n-sa[k]+1-height[k];<br /><br />整理下求和公示.</p>
<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 />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">cstring</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></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 /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;maxn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1003</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;F(x)&nbsp;((x)/3+((x)%3==1?0:tb))</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;G(x)&nbsp;((x)&lt;tb?(x)*3+1:((x)-tb)*3+2)</span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;wa[maxn],wb[maxn],wv[maxn],ws[maxn];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_232_286_Open_Image" onclick="this.style.display='none'; Codehighlighter1_232_286_Open_Text.style.display='none'; Codehighlighter1_232_286_Closed_Image.style.display='inline'; Codehighlighter1_232_286_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_232_286_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_232_286_Closed_Text.style.display='none'; Codehighlighter1_232_286_Open_Image.style.display='inline'; Codehighlighter1_232_286_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c0(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">r,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_232_286_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_232_286_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;r[a]</span><span style="color: #000000">==</span><span style="color: #000000">r[b]</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">r[a</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">==</span><span style="color: #000000">r[b</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">r[a</span><span style="color: #000000">+</span><span style="color: #000000">2</span><span style="color: #000000">]</span><span style="color: #000000">==</span><span style="color: #000000">r[b</span><span style="color: #000000">+</span><span style="color: #000000">2</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_322_441_Open_Image" onclick="this.style.display='none'; Codehighlighter1_322_441_Open_Text.style.display='none'; Codehighlighter1_322_441_Closed_Image.style.display='inline'; Codehighlighter1_322_441_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_322_441_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_322_441_Closed_Text.style.display='none'; Codehighlighter1_322_441_Open_Image.style.display='inline'; Codehighlighter1_322_441_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c12(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;k,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">r,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_322_441_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_322_441_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(k</span><span style="color: #000000">==</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;r[a]</span><span style="color: #000000">&lt;</span><span style="color: #000000">r[b]</span><span style="color: #000000">||</span><span style="color: #000000">r[a]</span><span style="color: #000000">==</span><span style="color: #000000">r[b]</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">c12(</span><span style="color: #000000">1</span><span style="color: #000000">,r,a</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,b</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;r[a]</span><span style="color: #000000">&lt;</span><span style="color: #000000">r[b]</span><span style="color: #000000">||</span><span style="color: #000000">r[a]</span><span style="color: #000000">==</span><span style="color: #000000">r[b]</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">wv[a</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">&lt;</span><span style="color: #000000">wv[b</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_487_701_Open_Image" onclick="this.style.display='none'; Codehighlighter1_487_701_Open_Text.style.display='none'; Codehighlighter1_487_701_Closed_Image.style.display='inline'; Codehighlighter1_487_701_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_487_701_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_487_701_Closed_Text.style.display='none'; Codehighlighter1_487_701_Open_Image.style.display='inline'; Codehighlighter1_487_701_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sort(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">r,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">a,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">b,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_487_701_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_487_701_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;wv[i]</span><span style="color: #000000">=</span><span style="color: #000000">r[a[i]];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">m;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;ws[i]</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;ws[wv[i]]</span><span style="color: #000000">++</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">m;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;ws[i]</span><span style="color: #000000">+=</span><span style="color: #000000">ws[i</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">n</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;i</span><span style="color: #000000">&gt;=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">--</span><span style="color: #000000">)&nbsp;b[</span><span style="color: #000000">--</span><span style="color: #000000">ws[wv[i]]]</span><span style="color: #000000">=</span><span style="color: #000000">a[i];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_740_1451_Open_Image" onclick="this.style.display='none'; Codehighlighter1_740_1451_Open_Text.style.display='none'; Codehighlighter1_740_1451_Closed_Image.style.display='inline'; Codehighlighter1_740_1451_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_740_1451_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_740_1451_Closed_Text.style.display='none'; Codehighlighter1_740_1451_Open_Image.style.display='inline'; Codehighlighter1_740_1451_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dc3(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">r,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sa,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_740_1451_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_740_1451_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,j,</span><span style="color: #000000">*</span><span style="color: #000000">rn</span><span style="color: #000000">=</span><span style="color: #000000">r</span><span style="color: #000000">+</span><span style="color: #000000">n,</span><span style="color: #000000">*</span><span style="color: #000000">san</span><span style="color: #000000">=</span><span style="color: #000000">sa</span><span style="color: #000000">+</span><span style="color: #000000">n,ta</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,tb</span><span style="color: #000000">=</span><span style="color: #000000">(n</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">3</span><span style="color: #000000">,tbc</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,p;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r[n]</span><span style="color: #000000">=</span><span style="color: #000000">r[n</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(i</span><span style="color: #000000">%</span><span style="color: #000000">3</span><span style="color: #000000">!=</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;wa[tbc</span><span style="color: #000000">++</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">i;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(r</span><span style="color: #000000">+</span><span style="color: #000000">2</span><span style="color: #000000">,wa,wb,tbc,m);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(r</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,wb,wa,tbc,m);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(r,wa,wb,tbc,m);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(p</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">,rn[F(wb[</span><span style="color: #000000">0</span><span style="color: #000000">])]</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,i</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">tbc;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rn[F(wb[i])]</span><span style="color: #000000">=</span><span style="color: #000000">c0(r,wb[i</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">],wb[i])</span><span style="color: #000000">?</span><span style="color: #000000">p</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">:p</span><span style="color: #000000">++</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(p</span><span style="color: #000000">&lt;</span><span style="color: #000000">tbc)&nbsp;dc3(rn,san,tbc,p);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">tbc;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;san[rn[i]]</span><span style="color: #000000">=</span><span style="color: #000000">i;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">tbc;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(san[i]</span><span style="color: #000000">&lt;</span><span style="color: #000000">tb)&nbsp;wb[ta</span><span style="color: #000000">++</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">san[i]</span><span style="color: #000000">*</span><span style="color: #000000">3</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(n</span><span style="color: #000000">%</span><span style="color: #000000">3</span><span style="color: #000000">==</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;wb[ta</span><span style="color: #000000">++</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">n</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(r,wb,wa,ta,m);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">tbc;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;wv[wb[i]</span><span style="color: #000000">=</span><span style="color: #000000">G(san[i])]</span><span style="color: #000000">=</span><span style="color: #000000">i;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,j</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,p</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">ta&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;j</span><span style="color: #000000">&lt;</span><span style="color: #000000">tbc;p</span><span style="color: #000000">++</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sa[p]</span><span style="color: #000000">=</span><span style="color: #000000">c12(wb[j]</span><span style="color: #000000">%</span><span style="color: #000000">3</span><span style="color: #000000">,r,wa[i],wb[j])</span><span style="color: #000000">?</span><span style="color: #000000">wa[i</span><span style="color: #000000">++</span><span style="color: #000000">]:wb[j</span><span style="color: #000000">++</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">ta;p</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;sa[p]</span><span style="color: #000000">=</span><span style="color: #000000">wa[i</span><span style="color: #000000">++</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(;j</span><span style="color: #000000">&lt;</span><span style="color: #000000">tbc;p</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;sa[p]</span><span style="color: #000000">=</span><span style="color: #000000">wb[j</span><span style="color: #000000">++</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rank[maxn],height[maxn];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_1520_1683_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1520_1683_Open_Text.style.display='none'; Codehighlighter1_1520_1683_Closed_Image.style.display='inline'; Codehighlighter1_1520_1683_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1520_1683_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1520_1683_Closed_Text.style.display='none'; Codehighlighter1_1520_1683_Open_Image.style.display='inline'; Codehighlighter1_1520_1683_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;calheight(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">r,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">sa,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1520_1683_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1520_1683_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,j,k</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;=</span><span style="color: #000000">n;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;rank[sa[i]]</span><span style="color: #000000">=</span><span style="color: #000000">i;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;height[rank[i</span><span style="color: #000000">++</span><span style="color: #000000">]]</span><span style="color: #000000">=</span><span style="color: #000000">k)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(k</span><span style="color: #000000">?</span><span style="color: #000000">k</span><span style="color: #000000">--</span><span style="color: #000000">:</span><span style="color: #000000">0</span><span style="color: #000000">,j</span><span style="color: #000000">=</span><span style="color: #000000">sa[rank[i]</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">];r[i</span><span style="color: #000000">+</span><span style="color: #000000">k]</span><span style="color: #000000">==</span><span style="color: #000000">r[j</span><span style="color: #000000">+</span><span style="color: #000000">k];k</span><span style="color: #000000">++</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;s[maxn];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r[maxn</span><span style="color: #000000">*</span><span style="color: #000000">3</span><span style="color: #000000">],sa[maxn</span><span style="color: #000000">*</span><span style="color: #000000">3</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img id="Codehighlighter1_1737_2042_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1737_2042_Open_Text.style.display='none'; Codehighlighter1_1737_2042_Closed_Image.style.display='inline'; Codehighlighter1_1737_2042_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1737_2042_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1737_2042_Closed_Text.style.display='none'; Codehighlighter1_1737_2042_Open_Image.style.display='inline'; Codehighlighter1_1737_2042_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1737_2042_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1737_2042_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i,n,t,ans;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&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">,</span><span style="color: #000000">&amp;</span><span style="color: #000000">t);<br /><img id="Codehighlighter1_1794_2026_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1794_2026_Open_Text.style.display='none'; Codehighlighter1_1794_2026_Closed_Image.style.display='inline'; Codehighlighter1_1794_2026_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1794_2026_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1794_2026_Closed_Text.style.display='none'; Codehighlighter1_1794_2026_Open_Image.style.display='inline'; Codehighlighter1_1794_2026_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(t</span><span style="color: #000000">--&gt;</span><span style="color: #000000">0</span><span style="color: #000000">)</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_1794_2026_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1794_2026_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%s</span><span style="color: #000000">"</span><span style="color: #000000">,s);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n</span><span style="color: #000000">=</span><span style="color: #000000">strlen(s);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">n;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;r[i]</span><span style="color: #000000">=</span><span style="color: #000000">s[i];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r[n]</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dc3(r,sa,n</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">128</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;calheight(r,sa,n);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans</span><span style="color: #000000">=</span><span style="color: #000000">n</span><span style="color: #000000">*</span><span style="color: #000000">(n</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">2</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(i</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;=</span><span style="color: #000000">n;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;ans</span><span style="color: #000000">-=</span><span style="color: #000000">height[i];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&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">,ans);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&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 /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span></div>
<p><br /><br />&nbsp;</p><img src ="http://www.cppblog.com/jericho/aggbug/149854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-06-30 21:19 <a href="http://www.cppblog.com/jericho/archive/2011/06/30/149854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>并查集类</title><link>http://www.cppblog.com/jericho/archive/2011/05/03/145600.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Tue, 03 May 2011 12:27:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/05/03/145600.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/145600.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/05/03/145600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/145600.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/145600.html</trackback:ping><description><![CDATA[<br>并查集提供的操作：<br>1.&nbsp;合并两个集合。<br>2. 判断两个元素是否在同一个集合里边。<br><br>
<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"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><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><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdlib</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cmath</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstring</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></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><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></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</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1001</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;<br><img id=Codehighlighter1_150_514_Open_Image onclick="this.style.display='none'; Codehighlighter1_150_514_Open_Text.style.display='none'; Codehighlighter1_150_514_Closed_Image.style.display='inline'; Codehighlighter1_150_514_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_150_514_Closed_Image onclick="this.style.display='none'; Codehighlighter1_150_514_Closed_Text.style.display='none'; Codehighlighter1_150_514_Open_Image.style.display='inline'; Codehighlighter1_150_514_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;UFS</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_150_514_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_150_514_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;F[MAXN];<br><img id=Codehighlighter1_182_220_Open_Image onclick="this.style.display='none'; Codehighlighter1_182_220_Open_Text.style.display='none'; Codehighlighter1_182_220_Closed_Image.style.display='inline'; Codehighlighter1_182_220_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_182_220_Closed_Image onclick="this.style.display='none'; Codehighlighter1_182_220_Closed_Text.style.display='none'; Codehighlighter1_182_220_Open_Image.style.display='inline'; Codehighlighter1_182_220_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;tUFS()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_182_220_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_182_220_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">MAXN;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)F[i]</span><span style="COLOR: #000000">=-</span><span style="COLOR: #000000">i;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_242_333_Open_Image onclick="this.style.display='none'; Codehighlighter1_242_333_Open_Text.style.display='none'; Codehighlighter1_242_333_Closed_Image.style.display='inline'; Codehighlighter1_242_333_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_242_333_Closed_Image onclick="this.style.display='none'; Codehighlighter1_242_333_Closed_Text.style.display='none'; Codehighlighter1_242_333_Open_Image.style.display='inline'; Codehighlighter1_242_333_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;findroot(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_242_333_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_242_333_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;r</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">a,t;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(F[r]</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;r</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">F[r];<br><img id=Codehighlighter1_299_318_Open_Image onclick="this.style.display='none'; Codehighlighter1_299_318_Open_Text.style.display='none'; Codehighlighter1_299_318_Closed_Image.style.display='inline'; Codehighlighter1_299_318_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_299_318_Closed_Image onclick="this.style.display='none'; Codehighlighter1_299_318_Closed_Text.style.display='none'; Codehighlighter1_299_318_Open_Image.style.display='inline'; Codehighlighter1_299_318_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(F[a]</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_299_318_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_299_318_Open_Text><span style="COLOR: #000000">{t</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">F[a];F[a]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">r;a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">t;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;r;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_359_392_Open_Image onclick="this.style.display='none'; Codehighlighter1_359_392_Open_Text.style.display='none'; Codehighlighter1_359_392_Closed_Image.style.display='inline'; Codehighlighter1_359_392_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_359_392_Closed_Image onclick="this.style.display='none'; Codehighlighter1_359_392_Closed_Text.style.display='none'; Codehighlighter1_359_392_Open_Image.style.display='inline'; Codehighlighter1_359_392_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Union(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_359_392_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_359_392_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[findroot(a)]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">findroot(b);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_418_462_Open_Image onclick="this.style.display='none'; Codehighlighter1_418_462_Open_Text.style.display='none'; Codehighlighter1_418_462_Closed_Image.style.display='inline'; Codehighlighter1_418_462_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_418_462_Closed_Image onclick="this.style.display='none'; Codehighlighter1_418_462_Closed_Text.style.display='none'; Codehighlighter1_418_462_Open_Image.style.display='inline'; Codehighlighter1_418_462_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;Judge(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_418_462_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_418_462_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;F[findroot(a)]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">F[findroot(b)];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_483_512_Open_Image onclick="this.style.display='none'; Codehighlighter1_483_512_Open_Text.style.display='none'; Codehighlighter1_483_512_Closed_Image.style.display='inline'; Codehighlighter1_483_512_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_483_512_Closed_Image onclick="this.style.display='none'; Codehighlighter1_483_512_Closed_Text.style.display='none'; Codehighlighter1_483_512_Open_Image.style.display='inline'; Codehighlighter1_483_512_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;getroot(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_483_512_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_483_512_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">F[findroot(a)];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<img src ="http://www.cppblog.com/jericho/aggbug/145600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-05-03 20:27 <a href="http://www.cppblog.com/jericho/archive/2011/05/03/145600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>次短路径与次小生成树问题的简单解法</title><link>http://www.cppblog.com/jericho/archive/2011/05/03/145599.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Tue, 03 May 2011 12:21:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/05/03/145599.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/145599.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/05/03/145599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/145599.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/145599.html</trackback:ping><description><![CDATA[<h3><strong>[次短路径]</strong></h3>
<p>次短路径可以看作是k短路径问题的一种特殊情况，求k短路径有Yen算法等较为复杂的方法，对于次短路径，可以有更为简易的方法。下面介绍一种求两个顶点之间次短路径的解法。</p>
<p>我们要对一个有向赋权图(无向图每条边可以看作两条相反的有向边)的顶点S到T之间求次短路径，首先应求出S的单源最短路径。遍历有向图，标记出<span style="TEXT-DECORATION: underline">可以在最短路径上的边</span>，加入集合K。然后枚举删除集合K中每条边，求从S到T的最短路径，记录每次求出的路径长度值，其最小值就是次短路径的长度。</p>
<p>在这里我们以为次短路径长度可以等于最短路径长度，如果想等，也可以看作是从S到T有不止一条最短路径。如果我们规定求从S到T大于最短路径长度的次短路径，则答案就是每次删边后<span style="TEXT-DECORATION: underline">大于原最短路径</span>的S到T的最短路径长度的最小值。</p>
<p>用Dijkstra+堆求单源最短路径，则每次求最短路径时间复杂度为O(N*log(N+M) + M)，所以总的时间复杂度为O(N*M*log(N+M) + M^2)。该估计是较为悲观的，因为一般来说，在最短路径上的边的条数要远远小于M，所以实际效果要比预想的好。</p>
<h3><strong>[次小生成树]</strong></h3>
<p>类比上述次短路径求法，很容易想到一个&#8220;枚举删除最小生成树上的每条边，再求最小生成树&#8221;的直观解法。如果用Prim+堆，每次最小生成树时间复杂度为O(N*log(N+M) + M)，枚举删除有O(N)条边，时间复杂度就是O(N^2*log(N+M) + N*M)，当图很稠密时，接近O(N^3)。这种方法简易直观，但我们有一个更简单，而且效率更高的O(N^2+M)的解法，下面介绍这种方法。</p>
<p>首先求出原图最小生成树，记录权值之和为MinST。枚举添加每条<span style="TEXT-DECORATION: underline">不在最小生成树上的边(u,v)</span>，加上以后一定会形成一个环。找到环上权值<span style="TEXT-DECORATION: underline">第二大的边</span>(即除了(u,v)以外的权值最大的边)，把它删掉，计算当前生成树的权值之和。取所有枚举修改的生成树权值之和的最小值，就是次小生成树。</p>
<p>具体实现时，更简单的方法是从每个节点i遍历整个最小生成树，定义F[j]为<span style="TEXT-DECORATION: underline">从i到j的路径上最大边的权值</span>。遍历图求出F[j]的值，然后对于添加每条不在最小生成树中的边(i,j)，新的生成树权值之和就是MinST + w(i,j) &#8211; F[j]，记录其最小值，则为次小生成树。</p>
<p>该算法的时间复杂度为O(N^2 + M)。由于只用求一次最小生成树，可以用最简单的Prim，时间复杂度为O(N^2)。算法的瓶颈不在求最小生成树，而在O(N^2+M)的枚举加边修改，所以用更好的最小生成树算法是没有必要的。</p>
<h3><strong>[次短路径与次小生成树的例题]</strong></h3>
<p><a title="Permanent Link to HAOI 2005 路由选择问题" href="http://www.byvoid.com/blog/haoi-2005-route/" rel=bookmark><u><font color=#0000ff>HAOI 2005 路由选择问题<br></font></u></a>直接求次短路径。</p>
<p><a title="Permanent Link to pku 3255 Roadblocks" href="http://www.byvoid.com/blog/pku-3255/" rel=bookmark><u><font color=#0000ff>pku 3255 Roadblocks<br></font></u></a>稍微特殊的次短路径，允许边重复走。</p>
<p><a title="Permanent Link to Ural 1416 Confidentialpku-1679" href="http://www.byvoid.com/blog/ural-1416/" rel=bookmark><u><font color=#0000ff>Ural 1416 Confidential<br></font></u></a>求次小生成树的问题、</p>
<p><a title="Permanent Link to pku 1679 The Unique MST" href="http://www.byvoid.com/blog/pku-1679/" rel=bookmark><u><font color=#0000ff>pku 1679 The Unique MST</font></u></a><br>判断最小生成树是否唯一。<br><br><br><a href="http://www.byvoid.com/blog/2-sp-mst/">http://www.byvoid.com/blog/2-sp-mst/</a></p>
<img src ="http://www.cppblog.com/jericho/aggbug/145599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-05-03 20:21 <a href="http://www.cppblog.com/jericho/archive/2011/05/03/145599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高精计算</title><link>http://www.cppblog.com/jericho/archive/2011/04/12/144060.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Tue, 12 Apr 2011 11:42:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/04/12/144060.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/144060.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/04/12/144060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/144060.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/144060.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: #include&nbsp;&lt;iostream&gt;&nbsp;using&nbsp;namespace&nbsp;std;&nbsp;template&lt;int&nbsp;LIM,int&nbsp;MAX&gt;&nbsp;class&nbsp;hp{&nbsp;&nbsp;&nbsp;&nbsp;public:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2011/04/12/144060.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/144060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-04-12 19:42 <a href="http://www.cppblog.com/jericho/archive/2011/04/12/144060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku 1204 Word Puzzles (trie)</title><link>http://www.cppblog.com/jericho/archive/2011/03/16/141927.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Tue, 15 Mar 2011 16:41:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/03/16/141927.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/141927.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/03/16/141927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/141927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/141927.html</trackback:ping><description><![CDATA[题意：给定一个n*m的字符阵列中，查找给出字串匹配的开始坐标位置， 配置可以是从开始坐标向四周8个方向。<br><br>分析：对需要匹配的字串建立trie树，枚举字符阵列的每个位置，每个方向，进行查询。<br><br>
<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"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><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><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></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><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;MAX&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">90000</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;M&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">26</span><span style="COLOR: #000000">,&nbsp;N&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1005</span><span style="COLOR: #000000">,&nbsp;W</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1005</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_119_151_Open_Image onclick="this.style.display='none'; Codehighlighter1_119_151_Open_Text.style.display='none'; Codehighlighter1_119_151_Closed_Image.style.display='inline'; Codehighlighter1_119_151_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_119_151_Closed_Image onclick="this.style.display='none'; Codehighlighter1_119_151_Closed_Text.style.display='none'; Codehighlighter1_119_151_Open_Image.style.display='inline'; Codehighlighter1_119_151_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;DX[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_119_151_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_119_151_Open_Text><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;}</span></span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_171_203_Open_Image onclick="this.style.display='none'; Codehighlighter1_171_203_Open_Text.style.display='none'; Codehighlighter1_171_203_Closed_Image.style.display='inline'; Codehighlighter1_171_203_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_171_203_Closed_Image onclick="this.style.display='none'; Codehighlighter1_171_203_Closed_Text.style.display='none'; Codehighlighter1_171_203_Open_Image.style.display='inline'; Codehighlighter1_171_203_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;DY[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_171_203_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_171_203_Open_Text><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;}</span></span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_223_255_Open_Image onclick="this.style.display='none'; Codehighlighter1_223_255_Open_Text.style.display='none'; Codehighlighter1_223_255_Closed_Image.style.display='inline'; Codehighlighter1_223_255_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_223_255_Closed_Image onclick="this.style.display='none'; Codehighlighter1_223_255_Closed_Text.style.display='none'; Codehighlighter1_223_255_Open_Image.style.display='inline'; Codehighlighter1_223_255_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;D[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_223_255_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_223_255_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">D</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">E</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">F</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">G</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">H</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sx,sy;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n,m,w;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;index;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;puzzles[N][N],&nbsp;word[W];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;r[W][</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_345_439_Open_Image onclick="this.style.display='none'; Codehighlighter1_345_439_Open_Text.style.display='none'; Codehighlighter1_345_439_Closed_Image.style.display='inline'; Codehighlighter1_345_439_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_345_439_Closed_Image onclick="this.style.display='none'; Codehighlighter1_345_439_Closed_Text.style.display='none'; Codehighlighter1_345_439_Open_Image.style.display='inline'; Codehighlighter1_345_439_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Node</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_345_439_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_345_439_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;end;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;child[M];<br><img id=Codehighlighter1_388_437_Open_Image onclick="this.style.display='none'; Codehighlighter1_388_437_Open_Text.style.display='none'; Codehighlighter1_388_437_Closed_Image.style.display='inline'; Codehighlighter1_388_437_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_388_437_Closed_Image onclick="this.style.display='none'; Codehighlighter1_388_437_Closed_Text.style.display='none'; Codehighlighter1_388_437_Open_Image.style.display='inline'; Codehighlighter1_388_437_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;Node()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_388_437_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_388_437_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end</span><span style="COLOR: #000000">=-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(child,NULL,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(child));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Node&nbsp;tree;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">Node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">root&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">tree;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_503_700_Open_Image onclick="this.style.display='none'; Codehighlighter1_503_700_Open_Text.style.display='none'; Codehighlighter1_503_700_Closed_Image.style.display='inline'; Codehighlighter1_503_700_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_503_700_Closed_Image onclick="this.style.display='none'; Codehighlighter1_503_700_Closed_Text.style.display='none'; Codehighlighter1_503_700_Open_Image.style.display='inline'; Codehighlighter1_503_700_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;insert(&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;s,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;d)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_503_700_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_503_700_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">node&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;root;<br><img id=Codehighlighter1_535_682_Open_Image onclick="this.style.display='none'; Codehighlighter1_535_682_Open_Text.style.display='none'; Codehighlighter1_535_682_Closed_Image.style.display='inline'; Codehighlighter1_535_682_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_535_682_Closed_Image onclick="this.style.display='none'; Codehighlighter1_535_682_Closed_Text.style.display='none'; Codehighlighter1_535_682_Open_Image.style.display='inline'; Codehighlighter1_535_682_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_535_682_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_535_682_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_552_572_Open_Image onclick="this.style.display='none'; Codehighlighter1_552_572_Open_Text.style.display='none'; Codehighlighter1_552_572_Closed_Image.style.display='inline'; Codehighlighter1_552_572_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_552_572_Closed_Image onclick="this.style.display='none'; Codehighlighter1_552_572_Closed_Text.style.display='none'; Codehighlighter1_552_572_Open_Image.style.display='inline'; Codehighlighter1_552_572_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(index</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_552_572_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_552_572_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_605_644_Open_Image onclick="this.style.display='none'; Codehighlighter1_605_644_Open_Text.style.display='none'; Codehighlighter1_605_644_Closed_Image.style.display='inline'; Codehighlighter1_605_644_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_605_644_Closed_Image onclick="this.style.display='none'; Codehighlighter1_605_644_Closed_Text.style.display='none'; Codehighlighter1_605_644_Open_Image.style.display='inline'; Codehighlighter1_605_644_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(node</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">child[</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_605_644_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_605_644_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">child[</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Node;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">node</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">child[</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">s</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;node</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">end&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_736_1057_Open_Image onclick="this.style.display='none'; Codehighlighter1_736_1057_Open_Text.style.display='none'; Codehighlighter1_736_1057_Closed_Image.style.display='inline'; Codehighlighter1_736_1057_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_736_1057_Closed_Image onclick="this.style.display='none'; Codehighlighter1_736_1057_Closed_Text.style.display='none'; Codehighlighter1_736_1057_Open_Image.style.display='inline'; Codehighlighter1_736_1057_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;search(</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;y,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;d)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_736_1057_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_736_1057_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">node&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;root</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">child[puzzles[x][y]</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(node</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img id=Codehighlighter1_824_1046_Open_Image onclick="this.style.display='none'; Codehighlighter1_824_1046_Open_Text.style.display='none'; Codehighlighter1_824_1046_Closed_Image.style.display='inline'; Codehighlighter1_824_1046_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_824_1046_Closed_Image onclick="this.style.display='none'; Codehighlighter1_824_1046_Closed_Text.style.display='none'; Codehighlighter1_824_1046_Open_Image.style.display='inline'; Codehighlighter1_824_1046_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(node)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_824_1046_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_824_1046_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_844_922_Open_Image onclick="this.style.display='none'; Codehighlighter1_844_922_Open_Text.style.display='none'; Codehighlighter1_844_922_Closed_Image.style.display='inline'; Codehighlighter1_844_922_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_844_922_Closed_Image onclick="this.style.display='none'; Codehighlighter1_844_922_Closed_Text.style.display='none'; Codehighlighter1_844_922_Open_Image.style.display='inline'; Codehighlighter1_844_922_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(node</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">end</span><span style="COLOR: #000000">&gt;-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_844_922_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_844_922_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r[node</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">end][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sx;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r[node</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">end][</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sy;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r[node</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">end][</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">DX[d];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">y</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">DY[d];<br><img id=Codehighlighter1_984_1028_Open_Image onclick="this.style.display='none'; Codehighlighter1_984_1028_Open_Text.style.display='none'; Codehighlighter1_984_1028_Closed_Image.style.display='inline'; Codehighlighter1_984_1028_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_984_1028_Closed_Image onclick="this.style.display='none'; Codehighlighter1_984_1028_Closed_Text.style.display='none'; Codehighlighter1_984_1028_Open_Image.style.display='inline'; Codehighlighter1_984_1028_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;x</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;x</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">n&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;y</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;y</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m&nbsp;)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_984_1028_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_984_1028_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">node</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">child[puzzles[x][y]</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">&nbsp;;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_1072_1192_Open_Image onclick="this.style.display='none'; Codehighlighter1_1072_1192_Open_Text.style.display='none'; Codehighlighter1_1072_1192_Closed_Image.style.display='inline'; Codehighlighter1_1072_1192_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1072_1192_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1072_1192_Closed_Text.style.display='none'; Codehighlighter1_1072_1192_Open_Image.style.display='inline'; Codehighlighter1_1072_1192_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;solve()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1072_1192_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1072_1192_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,j,k;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">n;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">j)<br><img id=Codehighlighter1_1142_1190_Open_Image onclick="this.style.display='none'; Codehighlighter1_1142_1190_Open_Text.style.display='none'; Codehighlighter1_1142_1190_Closed_Image.style.display='inline'; Codehighlighter1_1142_1190_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1142_1190_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1142_1190_Closed_Text.style.display='none'; Codehighlighter1_1142_1190_Open_Image.style.display='inline'; Codehighlighter1_1142_1190_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(k</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;k</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">k)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1142_1190_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1142_1190_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;j;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search(i,j,k);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_1206_1462_Open_Image onclick="this.style.display='none'; Codehighlighter1_1206_1462_Open_Text.style.display='none'; Codehighlighter1_1206_1462_Closed_Image.style.display='inline'; Codehighlighter1_1206_1462_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1206_1462_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1206_1462_Closed_Text.style.display='none'; Codehighlighter1_1206_1462_Open_Image.style.display='inline'; Codehighlighter1_1206_1462_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1206_1462_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1206_1462_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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">n,&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">w);<br><img id=Codehighlighter1_1263_1294_Open_Image onclick="this.style.display='none'; Codehighlighter1_1263_1294_Open_Text.style.display='none'; Codehighlighter1_1263_1294_Closed_Image.style.display='inline'; Codehighlighter1_1263_1294_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1263_1294_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1263_1294_Closed_Text.style.display='none'; Codehighlighter1_1263_1294_Open_Image.style.display='inline'; Codehighlighter1_1263_1294_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">n;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1263_1294_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1263_1294_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">puzzles[i]);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1313_1363_Open_Image onclick="this.style.display='none'; Codehighlighter1_1313_1363_Open_Text.style.display='none'; Codehighlighter1_1313_1363_Closed_Image.style.display='inline'; Codehighlighter1_1313_1363_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1313_1363_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1313_1363_Closed_Text.style.display='none'; Codehighlighter1_1313_1363_Open_Image.style.display='inline'; Codehighlighter1_1313_1363_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">w;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1313_1363_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1313_1363_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">word[i]);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insert(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">word[i],i);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;solve();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">w;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;%d&nbsp;%c\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;r[i][</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">],&nbsp;r[i][</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">],&nbsp;D[r[i][</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]]);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br><br>
<img src ="http://www.cppblog.com/jericho/aggbug/141927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-03-16 00:41 <a href="http://www.cppblog.com/jericho/archive/2011/03/16/141927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pku 1200 Crazy Search (Rabin Karp)</title><link>http://www.cppblog.com/jericho/archive/2011/03/16/141926.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Tue, 15 Mar 2011 16:08:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/03/16/141926.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/141926.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/03/16/141926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/141926.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/141926.html</trackback:ping><description><![CDATA[<p>题意：统计由d个不同字符组成的串中，长度为n的不同字串数目。<br><br>分析：Rabin Karp</p>
<p style="MARGIN-LEFT: 21pt" class=MsoNormal><span lang=EN-US>Rabin-Karp</span> <span>算法（以下简称为</span> <span lang=EN-US>RK</span> <span>算法），是基于这样的思路：即把串看作是字符集长度进制的数，由数的比较得出字符串的比较结果。例如，给定字符集为∑</span> <span lang=EN-US>={0,1,2,3,4,5,6,7,8,9}</span> <span>，∑长度为</span> <span lang=EN-US>d=10</span> <span>，那么任何以∑为字符集的串都可看作</span> <span lang=EN-US>d</span> <span>（此处为</span> <span lang=EN-US>10</span> <span>）进制的数。</span> </p>
<p style="MARGIN-LEFT: 21pt" class=MsoNormal><span>记模式串</span> <span lang=EN-US>P[0..n-1]</span> <span>对应的数值为</span> <span lang=EN-US>P</span> <span>，</span> <span lang=EN-US>T[0..n-1]</span> <span>所有长度为</span> <span lang=EN-US>m</span> <span>的子串对应的数值为</span> <span lang=EN-US>t<sub><font size=2>s</font></sub> </span><span>，设</span> <span lang=EN-US>P</span> <span>和</span> <span lang=EN-US>T</span> <span>都是基于字符集长度为</span> <span lang=EN-US>|</span> <span>∑</span> <span lang=EN-US>|=d</span> <span>的字符串。</span> </p>
<p style="MARGIN-LEFT: 21pt" class=MsoNormal><span>那么，</span> <span lang=EN-US>t<sub><font size=2>s</font></sub> </span><span>即为</span> <span lang=EN-US>T[s..s+m]</span> <span>对应的数值，这里</span> <span lang=EN-US>0&lt;=s&lt;=n-m-1</span> <span>。</span> </p>
<p style="MARGIN-LEFT: 21pt" class=MsoNormal><span lang=EN-US>P = P[m]+d*(P[m-1]+d*(P[m-2]+..)))</span> </p>
<p style="MARGIN-LEFT: 21pt" class=MsoNormal><span>同样</span> <span lang=EN-US>t<sub><font size=2>0</font></sub> </span><span>也可类似求得。</span> </p>
<p style="MARGIN-LEFT: 21pt" class=MsoNormal><span>最重要的是如何从</span> <span lang=EN-US>t<sub><font size=2>s</font></sub> </span><span>求出</span> <span lang=EN-US>t<sub><font size=2>s+1</font></sub> </span><span>。</span> </p>
<p style="MARGIN-LEFT: 21pt" class=MsoNormal><span lang=EN-US>t<sub><font size=2>s+1</font></sub> =T[s+m]+d*(t<sub><font size=2>s</font></sub> +d<sup><font size=2>m-1</font></sup> *T[s])</span> </p>
<p style="MARGIN-LEFT: 21pt" class=MsoNormal><span>注：此处是该算法的关键，即在常数时间内能够计算出下一个</span> <span lang=EN-US>m</span> <span>长度的字串对应的数值。初看比较抽象，举个例子就比较明白了，设</span> <span lang=EN-US>x=12345</span> <span>，现在是已知长度为</span> <span lang=EN-US>3</span> <span>的数值</span> <span lang=EN-US>234</span> <span>，现在要求</span> <span lang=EN-US>345</span> <span>对应的数值，可以这样来得到：</span> <span lang=EN-US>345 = 5 + 10*(234-10<sup><font size=2>2</font></sup> *2)</span> </p>
<br>
<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"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><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><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></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><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;MAX&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100000000</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;hash[MAX];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;text[MAX];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;key[</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">],c[</span><span style="COLOR: #000000">10000</span><span style="COLOR: #000000">],&nbsp;ans;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img id=Codehighlighter1_142_680_Open_Image onclick="this.style.display='none'; Codehighlighter1_142_680_Open_Text.style.display='none'; Codehighlighter1_142_680_Closed_Image.style.display='inline'; Codehighlighter1_142_680_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_142_680_Closed_Image onclick="this.style.display='none'; Codehighlighter1_142_680_Closed_Text.style.display='none'; Codehighlighter1_142_680_Open_Image.style.display='inline'; Codehighlighter1_142_680_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_142_680_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_142_680_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,&nbsp;n,d,len;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">freopen("input.txt","r",&nbsp;stdin);</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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">d);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;text);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strlen(text);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">init</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;c[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">10000</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;c[i</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">d;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_356_424_Open_Image onclick="this.style.display='none'; Codehighlighter1_356_424_Open_Text.style.display='none'; Codehighlighter1_356_424_Closed_Image.style.display='inline'; Codehighlighter1_356_424_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_356_424_Closed_Image onclick="this.style.display='none'; Codehighlighter1_356_424_Closed_Text.style.display='none'; Codehighlighter1_356_424_Open_Image.style.display='inline'; Codehighlighter1_356_424_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">len;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_356_424_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_356_424_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(key[text[i]]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key[text[i]]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">k</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(k</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">d)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">sovle</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;h</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">n;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;h</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">d&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;key[text[i]];<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;hash[h]</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;ans</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img id=Codehighlighter1_542_642_Open_Image onclick="this.style.display='none'; Codehighlighter1_542_642_Open_Text.style.display='none'; Codehighlighter1_542_642_Closed_Image.style.display='inline'; Codehighlighter1_542_642_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_542_642_Closed_Image onclick="this.style.display='none'; Codehighlighter1_542_642_Closed_Text.style.display='none'; Codehighlighter1_542_642_Open_Image.style.display='inline'; Codehighlighter1_542_642_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">len</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">n;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_542_642_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_542_642_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;d</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(h</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">c[n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">key[text[i]])&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;key[text[i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">n]];<br><img id=Codehighlighter1_608_639_Open_Image onclick="this.style.display='none'; Codehighlighter1_608_639_Open_Text.style.display='none'; Codehighlighter1_608_639_Closed_Image.style.display='inline'; Codehighlighter1_608_639_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_608_639_Closed_Image onclick="this.style.display='none'; Codehighlighter1_608_639_Closed_Text.style.display='none'; Codehighlighter1_608_639_Open_Image.style.display='inline'; Codehighlighter1_608_639_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">hash[h])</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_608_639_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_608_639_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hash[h]</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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;ans);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<img src ="http://www.cppblog.com/jericho/aggbug/141926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-03-16 00:08 <a href="http://www.cppblog.com/jericho/archive/2011/03/16/141926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络流] 方格取数问题 ( 二分图点权最大独立集, 最小割模型, 最大流)</title><link>http://www.cppblog.com/jericho/archive/2011/03/14/141834.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Mon, 14 Mar 2011 15:20:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/03/14/141834.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/141834.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/03/14/141834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/141834.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/141834.html</trackback:ping><description><![CDATA[<p>【问题分析】</p>
<p>二分图点权最大独立集，转化为最小割模型，从而用最大流解决。</p>
<p>【建模方法】</p>
<p>首先把棋盘黑白染色，使相邻格子颜色不同，所有黑色格子看做二分图X集合中顶点，白色格子看做Y集合顶点，建立附加源S汇T。</p>
<p>1、从S向X集合中每个顶点连接一条容量为格子中数值的有向边。<br>2、从Y集合中每个顶点向T连接一条容量为格子中数值的有向边。<br>3、相邻黑白格子Xi,Yj之间从Xi向Yj连接一条容量为无穷大的有向边。</p>
<p>求出网络最大流，要求的结果就是所有格子中数值之和减去最大流量。</p>
<p>【建模分析】</p>
<p>这是一个二分图最大点权独立集问题，就是找出图中一些点，使得这些点之间没有边相连，这些点的权值之和最大。独立集与覆盖集是互补的，求最大点权独立集可以转化为求最小点权覆盖集（最小点权支配集）。最小点权覆盖集问题可以转化为最小割问题解决。结论:最大点权独立集 = 所有点权 - 最小点权覆盖集 = 所有点权 - 最小割集 = 所有点权 - 网络最大流。</p>
<p>对于一个网络，除去冗余点（不存在一条ST路径经过的点），每个顶点都在一个从S到T的路径上。割的性质就是不存在从S到T的路径，简单割可以认为割边关联的非ST节点为割点，而在二分图网络流模型中每个点必关联到一个割点（否则一定还有增广路，当前割不成立），所以一个割集对应了一个覆盖集（支配集）。最小点权覆盖集就是最小简单割，求最小简单割的建模方法就是把XY集合之间的变容量设为无穷大，此时的最小割就是最小简单割了。</p>
<p>有关二分图最大点权独立集问题，更多讨论见《最小割模型在信息学竞赛中的应用》作者胡伯涛。</p>
<img src ="http://www.cppblog.com/jericho/aggbug/141834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-03-14 23:20 <a href="http://www.cppblog.com/jericho/archive/2011/03/14/141834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络流] 试题库问题 (二分图多重匹配, 最大流)</title><link>http://www.cppblog.com/jericho/archive/2011/03/13/141750.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Sun, 13 Mar 2011 15:53:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/03/13/141750.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/141750.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/03/13/141750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/141750.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/141750.html</trackback:ping><description><![CDATA[<p>【问题分析】</p>
<p>二分图多重匹配问题，用最大流解决。</p>
<p>【建模方法】</p>
<p>建立二分图，每个类别为X集合中的顶点，每个题为Y集合中的顶点，增设附加源S和汇T。</p>
<p>1、从S向每个Xi连接一条容量为该类别所需数量的有向边。<br>2、从每个Yi向T连接一条容量为1的有向边。<br>3、如果一个题i属于一个类别j，连接一条从Xj到Yi容量为1的有向边。</p>
<p>求网络最大流，如果最大流量等于所有类别所需之和，则存在解，否则无解。对于每个类别，从X集合对应点出发的所有满流边，指向的B集合中的顶点就是该类别的所选的题（一个可行解）。</p>
<p>【建模分析】</p>
<p>二分图多重匹配问题。X，Y集合之间的边容量全部是1，保证两个点只能匹配一次，源汇的连边限制了每个点匹配的个数。求出网络最大流，如果流量等于X集合所有点与S边容量之和，那么则说明X集合每个点都有完备的多重匹配。</p>
<img src ="http://www.cppblog.com/jericho/aggbug/141750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-03-13 23:53 <a href="http://www.cppblog.com/jericho/archive/2011/03/13/141750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络流] 最长递增子序列问题 (DP, 最大流)</title><link>http://www.cppblog.com/jericho/archive/2011/03/10/141481.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Thu, 10 Mar 2011 03:10:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/03/10/141481.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/141481.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/03/10/141481.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/141481.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/141481.html</trackback:ping><description><![CDATA[题意：<br>Q1：LIS，最长长度为s<br>Q2：有多少个长度为s的子序列<br>Q3：若A[1]和A[n]可多次使用，问可以取多少个s长度的子序列<br><br>建模：<br><br>Q1：LIS，DP， F[i]表示以第i位为开头的最长上升序列的长度，求出最长上升序列长度K<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"><img id=Codehighlighter1_22_146_Open_Image onclick="this.style.display='none'; Codehighlighter1_22_146_Open_Text.style.display='none'; Codehighlighter1_22_146_Closed_Image.style.display='inline'; Codehighlighter1_22_146_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_22_146_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_146_Closed_Text.style.display='none'; Codehighlighter1_22_146_Open_Image.style.display='inline'; Codehighlighter1_22_146_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><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">N;i</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">)</span><span id=Codehighlighter1_22_146_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_22_146_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;F[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><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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">i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">N;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(A[j]&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;A[i]&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;F[j]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;F[i])<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;F[j]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(F[i]&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Ans)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ans&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;F[i];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>Q2：<br>1、把序列每位i拆成两个点&lt;i.a&gt;和&lt;i.b&gt;，从&lt;i.a&gt;到&lt;i.b&gt;连接一条容量为1的有向边。<br>2、建立附加源S和汇T，如果序列第i位有F[i]=K，从S到&lt;i.a&gt;连接一条容量为1的有向边。<br>3、如果F[i]=1，从&lt;i.b&gt;到T连接一条容量为1的有向边。<br>4、如果j&gt;i且A[i] &lt; A[j]且F[j]+1=F[i]，从&lt;i.b&gt;到&lt;j.a&gt;连接一条容量为1的有向边。<br><br>求最大流，为第二问的解。<br><br>Q3：令(&lt;1.a&gt;,&lt;1.b&gt;)(&lt;N.a&gt;,&lt;N.b&gt;)(S,&lt;1.a&gt;)(&lt;N.b&gt;,T)这四条边的容量修改为无穷大，再求一次网络最大流，就是第三问结果。
<img src ="http://www.cppblog.com/jericho/aggbug/141481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-03-10 11:10 <a href="http://www.cppblog.com/jericho/archive/2011/03/10/141481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络流] 圆桌问题 (二分图多重匹配, 最大流)</title><link>http://www.cppblog.com/jericho/archive/2011/03/09/141411.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Wed, 09 Mar 2011 04:50:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/03/09/141411.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/141411.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/03/09/141411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/141411.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/141411.html</trackback:ping><description><![CDATA[题意：<br>n个不同单位，每个单位ri 人；m个桌子，每个桌子坐ci人； 同一个单位的人不坐在一个桌子上，给出所有可能的方案。<br><br>建模：<br>建立二分图，每个单位为X集合中的结点，每个桌子为Y集合的结点，增加源点S和汇点T。<br><br>1. 添加 S-&gt;Xi，且权值为第i个单位的人数。<br>2. 添加 Yi-&gt;T，且权值为第i个桌子可容纳的人数。<br>3.添加 Xi -&gt;Yi，且权值为1。<br><br>求网络最大流，如果最大流量等于所有单位人数之和，则存在解，否则无解。对于每个单位，从X集合对应点出发的所有满流边指向的Y集合的顶点就是该单位人员的安排情况（一个可行解）。<br><br>分析：<br>对于二分图， 每个定点可以有多个匹配，称这类问题为二分图多重匹配。X，Y集合之间的边容量全部是1，保证两个点只能匹配一次（一个餐桌上只能有一个单位的一个人），源汇的连边限制了每个点匹配的个数。求出网络最大流，如果流量等于X集合所有点与S边容量之和，那么则说明X集合每个点都有完备的多重匹配。<br>
<img src ="http://www.cppblog.com/jericho/aggbug/141411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-03-09 12:50 <a href="http://www.cppblog.com/jericho/archive/2011/03/09/141411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络流] 魔术球问题 (枚举, 最小路径覆盖, 二分图最大匹配, 最大流)</title><link>http://www.cppblog.com/jericho/archive/2011/03/08/141380.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Tue, 08 Mar 2011 13:42:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/03/08/141380.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/141380.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/03/08/141380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/141380.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/141380.html</trackback:ping><description><![CDATA[<p>【问题分析】</p>
<p>枚举答案转化为判定性问题，然后最小路径覆盖，可以转化成二分图最大匹配，从而用最大流解决。</p>
<p>【建模方法】</p>
<p>枚举答案A，在图中建立节点1..A。如果对于i&lt;j有i+j为一个完全平方数，连接一条有向边(i,j)。该图是有向无环图，求最小路径覆盖。如果刚好满足最小路径覆盖数等于N，那么A是一个可行解，在所有可行解中找到最大的A，即为最优解。</p>
<p>具体方法可以顺序枚举A的值，当最小路径覆盖数刚好大于N时终止，A-1就是最优解。</p>
<p>【建模分析】</p>
<p>由于是顺序放球，每根柱子上的球满足这样的特征，即下面的球编号小于上面球的编号。抽象成图论，把每个球看作一个顶点，就是编号较小的顶点向编号较大的顶点连接边，条件是两个球可以相邻，即编号之和为完全平方数。每根柱子看做一条路径，N根柱子要覆盖掉所有点，一个解就是一个路径覆盖。</p>
<p>最小路径覆盖数随球的数量递增不递减，满足单调性，所以可以枚举答案（或二分答案），对于特定的答案求出最小路径覆盖数，一个可行解就是最小路径覆盖数等于N的答案，求出最大的可行解就是最优解。本问题更适合枚举答案而不是二分答案，因为如果顺序枚举答案，每次只需要在残量网络上增加新的节点和边，再增广一次即可。如果二分答案，就需要每次重新建图，大大增加了时间复杂度。</p>
<img src ="http://www.cppblog.com/jericho/aggbug/141380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-03-08 21:42 <a href="http://www.cppblog.com/jericho/archive/2011/03/08/141380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络流]最小路径覆盖问题 (二分图最大匹配, 最大流)</title><link>http://www.cppblog.com/jericho/archive/2011/03/05/141175.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Sat, 05 Mar 2011 15:29:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/03/05/141175.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/141175.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/03/05/141175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/141175.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/141175.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 题意：有向无环图中，需要多少条简单路可以覆盖整个图。建模：构造二分图。把原图的每个顶点i拆分成二分图X，Y集合中的两个顶点Xi和Yi。对于原图的边(i, i)，连接(Xi, Yj)，值为1，然后把二分图最大匹配模型转化为网络留模型，求最大流。分析：对于一个路径覆盖，有如下性质：1、每个顶点属于且只属于一个路径。2、路径上除终点外，从每个顶点出发只有一条边指向路径上的另一顶点。所以我们可...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2011/03/05/141175.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/141175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-03-05 23:29 <a href="http://www.cppblog.com/jericho/archive/2011/03/05/141175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络流]太空飞行计划问题 (最大权闭合图)</title><link>http://www.cppblog.com/jericho/archive/2011/03/02/140975.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Wed, 02 Mar 2011 04:32:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/03/02/140975.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/140975.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/03/02/140975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/140975.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/140975.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 把每个实验看作二分图X集合中的顶点，每个设备看作二分图Y集合中的顶点，增加源S和汇T。1、从S向每个Xi连接一条容量为该点收入的有向边。2、从Yi向T连接一条容量为该点支出的有向边。3、如果一个实验i需要设备j，连接一条从Xi到Yj容量为无穷大的有向边。统计出所有实验的收入只和Total，求网络最大流Maxflow，最大收益就是Total-Maxflow。对应的解就是最小割划分出的S集合中的点...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2011/03/02/140975.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/140975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-03-02 12:32 <a href="http://www.cppblog.com/jericho/archive/2011/03/02/140975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络流]飞行员配对方案问题 (二分图最大匹配问题, 最大流)</title><link>http://www.cppblog.com/jericho/archive/2011/02/24/140580.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Thu, 24 Feb 2011 04:35:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/02/24/140580.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/140580.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/02/24/140580.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/140580.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/140580.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 题意：二分图最大匹配问题。解法1：匈牙利算法。解法2：最大流。添加原点s和汇点t。设二分图左边的点集为X，添加从s 到X（1,2,....,m ）的边，权值为1；右边的点集为Y，添加从Y（n-m+1, n-m+1, .... , n）到t 的边，权值为1；田间X和Y之间的边。求最大流。我用Dinic。最大流就是最大匹配。 配对保存在flow[i][j]中。#include&nbsp;&lt;f...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2011/02/24/140580.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/140580.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-02-24 12:35 <a href="http://www.cppblog.com/jericho/archive/2011/02/24/140580.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符串Hash算法</title><link>http://www.cppblog.com/jericho/archive/2011/02/23/140552.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Wed, 23 Feb 2011 14:16:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2011/02/23/140552.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/140552.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2011/02/23/140552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/140552.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/140552.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 据说，Hash的优劣顺序为：BKDRHash, APHash, DJBHash, JSHash, RSHash, SDBMHash, PJWHash, ELFHash。unsigned&nbsp;int&nbsp;SDBMHash(char&nbsp;*str){&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;hash&nbsp;=&nbsp;0;...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2011/02/23/140552.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/140552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2011-02-23 22:16 <a href="http://www.cppblog.com/jericho/archive/2011/02/23/140552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>克莱姆法则</title><link>http://www.cppblog.com/jericho/archive/2010/12/23/137300.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Thu, 23 Dec 2010 08:02:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2010/12/23/137300.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/137300.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2010/12/23/137300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/137300.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/137300.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<img border=0 src="http://www.cppblog.com/images/cppblog_com/jericho/1.jpg"> 
<img src ="http://www.cppblog.com/jericho/aggbug/137300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2010-12-23 16:02 <a href="http://www.cppblog.com/jericho/archive/2010/12/23/137300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>后缀数组</title><link>http://www.cppblog.com/jericho/archive/2010/11/02/132196.html</link><dc:creator>小阮</dc:creator><author>小阮</author><pubDate>Tue, 02 Nov 2010 13:47:00 GMT</pubDate><guid>http://www.cppblog.com/jericho/archive/2010/11/02/132196.html</guid><wfw:comment>http://www.cppblog.com/jericho/comments/132196.html</wfw:comment><comments>http://www.cppblog.com/jericho/archive/2010/11/02/132196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jericho/comments/commentRss/132196.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jericho/services/trackbacks/132196.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: //&nbsp;for&nbsp;pairsinline&nbsp;bool&nbsp;leq(int&nbsp;a1,&nbsp;int&nbsp;a2,&nbsp;int&nbsp;b1,&nbsp;int&nbsp;b2){&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;(a1&lt;b1&nbsp;||&nbsp;a1==b1&nbsp;&amp;&am...&nbsp;&nbsp;<a href='http://www.cppblog.com/jericho/archive/2010/11/02/132196.html'>阅读全文</a><img src ="http://www.cppblog.com/jericho/aggbug/132196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jericho/" target="_blank">小阮</a> 2010-11-02 21:47 <a href="http://www.cppblog.com/jericho/archive/2010/11/02/132196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>