﻿<?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++博客-糯米-随笔分类-Algorithm</title><link>http://www.cppblog.com/varg-vikernes/category/16058.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 15 Sep 2011 17:41:06 GMT</lastBuildDate><pubDate>Thu, 15 Sep 2011 17:41:06 GMT</pubDate><ttl>60</ttl><item><title>str_fastcmp</title><link>http://www.cppblog.com/varg-vikernes/archive/2011/09/14/155783.html</link><dc:creator>糯米</dc:creator><author>糯米</author><pubDate>Wed, 14 Sep 2011 14:00:00 GMT</pubDate><guid>http://www.cppblog.com/varg-vikernes/archive/2011/09/14/155783.html</guid><wfw:comment>http://www.cppblog.com/varg-vikernes/comments/155783.html</wfw:comment><comments>http://www.cppblog.com/varg-vikernes/archive/2011/09/14/155783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/varg-vikernes/comments/commentRss/155783.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/varg-vikernes/services/trackbacks/155783.html</trackback:ping><description><![CDATA[<span style="font-family: Courier; ">摘自：luajit源码lj_str.c</span><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Fast&nbsp;string&nbsp;data&nbsp;comparison.&nbsp;Caveat:&nbsp;unaligned&nbsp;access&nbsp;to&nbsp;1st&nbsp;string!&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;LJ_AINLINE&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;str_fastcmp(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">a,&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">b,&nbsp;MSize&nbsp;len)<br />{<br />&nbsp;&nbsp;MSize&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;lua_assert(len&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;lua_assert((((uintptr_t)a&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;len)&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">&nbsp;(LJ_PAGESIZE</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">))&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;LJ_PAGESIZE</span><span style="color: #000000; ">-</span><span style="color: #000000; ">4</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; ">&nbsp;{&nbsp;&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Note:&nbsp;innocuous&nbsp;access&nbsp;up&nbsp;to&nbsp;end&nbsp;of&nbsp;string&nbsp;+&nbsp;3.&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;v&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;lj_getu32(a</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i)&nbsp;</span><span style="color: #000000; ">^</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;uint32_t&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)(b</span><span style="color: #000000; ">+</span><span style="color: #000000; ">i);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(v)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;len;<br /></span><span style="color: #0000FF; ">#if</span><span style="color: #000000; ">&nbsp;LJ_LE</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(int32_t)i&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;(v&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">32</span><span style="color: #000000; ">+</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">)))&nbsp;:&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">#else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(int32_t)i&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;(v&nbsp;</span><span style="color: #000000; ">&gt;&gt;</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">32</span><span style="color: #000000; ">+</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">)))&nbsp;:&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;(i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;len);<br />&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}<br /></span></div><div></div><img src ="http://www.cppblog.com/varg-vikernes/aggbug/155783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/varg-vikernes/" target="_blank">糯米</a> 2011-09-14 22:00 <a href="http://www.cppblog.com/varg-vikernes/archive/2011/09/14/155783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Minimal Steiner Tree 简介</title><link>http://www.cppblog.com/varg-vikernes/archive/2011/02/24/140560.html</link><dc:creator>糯米</dc:creator><author>糯米</author><pubDate>Wed, 23 Feb 2011 16:19:00 GMT</pubDate><guid>http://www.cppblog.com/varg-vikernes/archive/2011/02/24/140560.html</guid><wfw:comment>http://www.cppblog.com/varg-vikernes/comments/140560.html</wfw:comment><comments>http://www.cppblog.com/varg-vikernes/archive/2011/02/24/140560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/varg-vikernes/comments/commentRss/140560.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/varg-vikernes/services/trackbacks/140560.html</trackback:ping><description><![CDATA[MinimalSteinerTree 的意思是：<br>在图中找出一个生成树，需要将指定的数个点连接，边权总值最小。<br>最小生成树是 MinimalSteinerTree
的一种特殊情况。<br>此问题是NP完全问题。<br>在POJ 3123中的标程给出了一个递归的算法来解决这个问题。<br><br>首先用floyd算法求出两两之间的最短路径。<br>然后把所有点都两两链接起来，权值就是它们的最短路径。<br>假设指定必须连接的点有N个。<br>那么MinimalSteinerTree
树中的内点最多有N-2个。<br>在纸上画一下就知道了，内点最多的情况就是树为满二叉树的情况。<br>而由于之前的floyd算法。把整个图给&#8220;缩&#8221;了一下。<br>所以树最多有N-2+N个点。<br>枚举所有可能的点集。对每个点集求最小生成树。取最小值即可。<br><br>另外一种方法是使用动态规划，详情请见<a  href="http://www.cppblog.com/varg-vikernes/archive/2011/02/24/140598.html">这里</a>。<br>   <img src ="http://www.cppblog.com/varg-vikernes/aggbug/140560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/varg-vikernes/" target="_blank">糯米</a> 2011-02-24 00:19 <a href="http://www.cppblog.com/varg-vikernes/archive/2011/02/24/140560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[小程序]给出一个圆，上面有数个点，任取4个点组成四边形，使得此四边形面积最大</title><link>http://www.cppblog.com/varg-vikernes/archive/2011/01/15/138565.html</link><dc:creator>糯米</dc:creator><author>糯米</author><pubDate>Sat, 15 Jan 2011 03:07:00 GMT</pubDate><guid>http://www.cppblog.com/varg-vikernes/archive/2011/01/15/138565.html</guid><wfw:comment>http://www.cppblog.com/varg-vikernes/comments/138565.html</wfw:comment><comments>http://www.cppblog.com/varg-vikernes/archive/2011/01/15/138565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/varg-vikernes/comments/commentRss/138565.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/varg-vikernes/services/trackbacks/138565.html</trackback:ping><description><![CDATA[这个问题源于POJ 2500。由于看错了题目，我把题意理解成&#8220;给出一个圆，上面有数个点，任取4个点组成四边形，使得此四边形面积最大&#8221;。<br>标程给出的方法是O(N^2)，是对于点之间距离固定的情况。<br>我也想出了一个O(N^2)的算法用于解决任意位置的点的情况。<br><br>将点按照顺时针排序<br>假设四边形的四个点A, B, C, D。按照顺时针方向排序。<br>按顺序枚举A<br>&nbsp;&nbsp; 按顺序枚举C<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B取最接近弧AC中心的点，D同理<br><br>在纸上画画就可以看出，如果C是递增的，则BD也是递增的。<br>因此C扫了一圈，BD加起来最多也扫两圈。<br>枚举A是O(N)，枚举C是O(N)，BD均摊下来也是O(N)<br>所以总复杂度是O(N^2)<br><br>虽然说复杂度跟标程一样，但还是TLE了，哥很久没写C代码了，现在比较挫。<br><br> <img src ="http://www.cppblog.com/varg-vikernes/aggbug/138565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/varg-vikernes/" target="_blank">糯米</a> 2011-01-15 11:07 <a href="http://www.cppblog.com/varg-vikernes/archive/2011/01/15/138565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Floyd 算法原理</title><link>http://www.cppblog.com/varg-vikernes/archive/2011/01/15/138563.html</link><dc:creator>糯米</dc:creator><author>糯米</author><pubDate>Sat, 15 Jan 2011 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/varg-vikernes/archive/2011/01/15/138563.html</guid><wfw:comment>http://www.cppblog.com/varg-vikernes/comments/138563.html</wfw:comment><comments>http://www.cppblog.com/varg-vikernes/archive/2011/01/15/138563.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/varg-vikernes/comments/commentRss/138563.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/varg-vikernes/services/trackbacks/138563.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: 'AR PL UKai CN'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: verdana,sans-serif; font-size: 14px; line-height: 21px; text-align: left;">
<p style="padding: 0px; margin: 1em 0px 0.5em;">&nbsp;&nbsp;&nbsp; floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话，首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题，我们需要为这个目标重新做一个诠释（这个诠释正是动态规划最富创造力的精华所在），floyd算法加入了这个概念</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">&nbsp;&nbsp; &nbsp;A<sup>k</sup>(i,j)：表示从i到j<strong>中途</strong><strong>不经过索引比k大的点的最短路径</strong>。</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">&nbsp;&nbsp; &nbsp;这个限制的重要之处在于，它将最短路径的概念做了限制，使得该限制有机会满足迭代关系，这个迭代关系就在于研究：假设A<sup>k</sup>(i,j)已知，是否可以借此推导出A<sup>k-1</sup>(i,j)。</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">&nbsp;&nbsp; &nbsp;假设我现在要得到A<sup>k</sup>(i,j)，而此时A<sup>k</sup>(i,j)已知，那么我可以分两种情况来看待问题：1.&nbsp;A<sup>k</sup>(i,j)沿途经过点k；2.&nbsp;A<sup>k</sup>(i,j)不经过点k。如果经过点k，那么很显然，A<sup>k</sup>(i,j) =&nbsp;A<sup>k-1</sup>(i,k) +&nbsp;A<sup>k-1</sup>(k,j)，为什么是A<sup>k-1</sup>呢？因为对(i,k)和(k,j)，由于k本身就是源点（或者说终点），加上我们求的是A<sup>k</sup>(i,j)，所以满足不经过比k大的点的条件限制，且已经不会经过点k，故得出了A<sup>k-1</sup>这个值。那么遇到第二种情况，A<sup>k</sup>(i,j)不经过点k时，由于没有经过点k，所以根据概念，可以得出A<sup>k</sup>(i,j)=A<sup>k-1</sup>(i,j)。现在，我们确信有且只有这两种情况---不是经过点k，就是不经过点k，没有第三种情况了，条件很完整，那么是选择哪一个呢？很简单，求的是最短路径，当然是哪个最短，求取哪个，故得出式子：</p>
<p style="padding: 0px; margin: 1em 0px 0.5em;">&nbsp;&nbsp; &nbsp;A<sup>k</sup>(i,j) = min(&nbsp;A<sup>k-1</sup>(i,j),&nbsp;A<sup>k-1</sup>(i,k) +&nbsp;A<sup>k-1</sup>(k,j) )</p>
</span></span><br>因此floyd的最外层循环：<br>for (k = 0; k &lt; n; k++) ...<br>就是分别求出 <span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: 'AR PL UKai CN'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: verdana,sans-serif; font-size: 14px; line-height: 21px; text-align: left;">A0(i,j), </span></span><span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: 'AR PL UKai CN'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: verdana,sans-serif; font-size: 14px; line-height: 21px; text-align: left;">A1(i,j), ..., </span></span><span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: 'AR PL UKai CN'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: verdana,sans-serif; font-size: 14px; line-height: 21px; text-align: left;">An(i,j) </span></span><br>我屡次写错floyd的程序，今天又写错一次。。尽管它很短，但原理真的很牛比。<br>只要知道了原理，就不会再写错了！<br><br class="Apple-interchange-newline"> <img src ="http://www.cppblog.com/varg-vikernes/aggbug/138563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/varg-vikernes/" target="_blank">糯米</a> 2011-01-15 10:56 <a href="http://www.cppblog.com/varg-vikernes/archive/2011/01/15/138563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小程序：消除方块游戏</title><link>http://www.cppblog.com/varg-vikernes/archive/2010/11/23/134401.html</link><dc:creator>糯米</dc:creator><author>糯米</author><pubDate>Tue, 23 Nov 2010 08:32:00 GMT</pubDate><guid>http://www.cppblog.com/varg-vikernes/archive/2010/11/23/134401.html</guid><wfw:comment>http://www.cppblog.com/varg-vikernes/comments/134401.html</wfw:comment><comments>http://www.cppblog.com/varg-vikernes/archive/2010/11/23/134401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/varg-vikernes/comments/commentRss/134401.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/varg-vikernes/services/trackbacks/134401.html</trackback:ping><description><![CDATA[有一个这样的小游戏：<br><br>多个不同颜色的方块位于一列，你每次可以消除一片连续的相同颜色的方块，并获得得分｛连续方块的个数^2｝。<br>消除完后右边的方块移动过来。<br>问，怎样玩才能使得分最高？<br><br>这是一道黑书上面的题目。我想了n久想不出来。。<br>黑书的解法是动态规划，时间复杂度为O(N^4)，空间复杂度为O(N^3)。<br>觉得挺有意思的，就把它的方法实现了一下。<br><br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Block&nbsp;Game</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>blocks&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">),&nbsp;(</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">),&nbsp;(</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">),&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">),&nbsp;(</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">6</span><span style="color: #000000;">),&nbsp;(</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">9</span><span style="color: #000000;">),&nbsp;(</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">10</span><span style="color: #000000;">)]<br>best&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{}<br>choose&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{}<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;sqr(x):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;x</span><span style="color: #000000;">*</span><span style="color: #000000;">x<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;dfs(i,&nbsp;j,&nbsp;k):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;i:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i,&nbsp;j,&nbsp;k)&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;best:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;best[(i,&nbsp;j,&nbsp;k)]<br>&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[(sqr(k&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;blocks[j][</span><span style="color: #000000;">1</span><span style="color: #000000;">])&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;dfs(i,&nbsp;j&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;0),&nbsp;j)]<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;p&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(i,&nbsp;j):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;blocks[p][0]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;blocks[j][0]:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;[(dfs(i,&nbsp;p,&nbsp;k&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;blocks[j][</span><span style="color: #000000;">1</span><span style="color: #000000;">])&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;dfs(p&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;j&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;0),&nbsp;p)]<br>&nbsp;&nbsp;&nbsp;&nbsp;best[(i,&nbsp;j,&nbsp;k)],&nbsp;choose[(i,&nbsp;j,&nbsp;k)]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;max(m)<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;best[(i,&nbsp;j,&nbsp;k)]<br><br></span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;show(i,&nbsp;j,&nbsp;k,&nbsp;s):<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;i:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">print&nbsp;'show',&nbsp;i,&nbsp;j,&nbsp;k,&nbsp;blocks</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;choose[(i,&nbsp;j,&nbsp;k)]<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;c&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;j:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;sqr(blocks[c][</span><span style="color: #000000;">1</span><span style="color: #000000;">])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;blocks,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">remove</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;c,&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">:</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;blocks[c],&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">score</span><span style="color: #800000;">'</span><span style="color: #000000;">,&nbsp;s<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">del</span><span style="color: #000000;">&nbsp;blocks[c]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show(i,&nbsp;j&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;0,&nbsp;s)<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show(c&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;j&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;0,&nbsp;s)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;blocks[c&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">][</span><span style="color: #000000;">1</span><span style="color: #000000;">]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blocks[c]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(blocks[c][0],&nbsp;blocks[c][</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">del</span><span style="color: #000000;">&nbsp;blocks[c&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show(i,&nbsp;c,&nbsp;v,&nbsp;s)<br><br>dfs(0,&nbsp;len(blocks)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;0)<br>show(0,&nbsp;len(blocks)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;0,&nbsp;0)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span></div>
<br> <img src ="http://www.cppblog.com/varg-vikernes/aggbug/134401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/varg-vikernes/" target="_blank">糯米</a> 2010-11-23 16:32 <a href="http://www.cppblog.com/varg-vikernes/archive/2010/11/23/134401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小程序：给出n个数，如何找出三个数，它们的和等于k</title><link>http://www.cppblog.com/varg-vikernes/archive/2010/11/21/134244.html</link><dc:creator>糯米</dc:creator><author>糯米</author><pubDate>Sun, 21 Nov 2010 15:10:00 GMT</pubDate><guid>http://www.cppblog.com/varg-vikernes/archive/2010/11/21/134244.html</guid><wfw:comment>http://www.cppblog.com/varg-vikernes/comments/134244.html</wfw:comment><comments>http://www.cppblog.com/varg-vikernes/archive/2010/11/21/134244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/varg-vikernes/comments/commentRss/134244.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/varg-vikernes/services/trackbacks/134244.html</trackback:ping><description><![CDATA[通常的思路是O(N^3)<br>但可以有小小优化：<br>一。先排序<br>二。枚举i, j, k的时候，固定i的时候，j和k分别从左从右扫描数组，直到两个碰到为止。<br>三。对于每个i，k从右扫描的开始位置是递减的。<br><br>然后就有了下面的小程序：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#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 src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">algorithm</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></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 src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;N&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;K&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br><img id="Codehighlighter1_118_148_Open_Image" onclick="this.style.display='none'; codehighlighter1_118_148_open_text.style.display="'none';" codehighlighter1_118_148_closed_image.style.display="'inline';" codehighlighter1_118_148_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_118_148_Closed_Image" onclick="this.style.display='none'; codehighlighter1_118_148_closed_text.style.display="'none';" codehighlighter1_118_148_open_image.style.display="'inline';" codehighlighter1_118_148_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;arr[]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_118_148_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_118_148_Open_Text"><span style="color: #000000;">{</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">}</span></span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br><img id="Codehighlighter1_163_549_Open_Image" onclick="this.style.display='none'; codehighlighter1_163_549_open_text.style.display="'none';" codehighlighter1_163_549_closed_image.style.display="'inline';" codehighlighter1_163_549_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_163_549_Closed_Image" onclick="this.style.display='none'; codehighlighter1_163_549_closed_text.style.display="'none';" codehighlighter1_163_549_open_image.style.display="'inline';" codehighlighter1_163_549_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_163_549_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_163_549_Open_Text"><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;">int</span><span style="color: #000000;">&nbsp;a,&nbsp;b,&nbsp;c,&nbsp;i;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;sort(arr,&nbsp;arr&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;N);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;N&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img id="Codehighlighter1_241_535_Open_Image" onclick="this.style.display='none'; codehighlighter1_241_535_open_text.style.display="'none';" codehighlighter1_241_535_closed_image.style.display="'inline';" codehighlighter1_241_535_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_241_535_Closed_Image" onclick="this.style.display='none'; codehighlighter1_241_535_closed_text.style.display="'none';" codehighlighter1_241_535_open_image.style.display="'inline';" codehighlighter1_241_535_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(a&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;a&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;c;&nbsp;a</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_241_535_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_241_535_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_273_532_Open_Image" onclick="this.style.display='none'; codehighlighter1_273_532_open_text.style.display="'none';" codehighlighter1_273_532_closed_image.style.display="'inline';" codehighlighter1_273_532_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_273_532_Closed_Image" onclick="this.style.display='none'; codehighlighter1_273_532_closed_text.style.display="'none';" codehighlighter1_273_532_open_image.style.display="'inline';" codehighlighter1_273_532_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;b&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;c;&nbsp;b</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_273_532_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_273_532_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(c&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</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;arr[a]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;arr[b]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;arr[c]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;K)<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;&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="color: #000000;">--</span><span style="color: #000000;">;<br><img id="Codehighlighter1_361_528_Open_Image" onclick="this.style.display='none'; codehighlighter1_361_528_open_text.style.display="'none';" codehighlighter1_361_528_closed_image.style.display="'inline';" codehighlighter1_361_528_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img style="display: none;" id="Codehighlighter1_361_528_Closed_Image" onclick="this.style.display='none'; codehighlighter1_361_528_closed_text.style.display="'none';" codehighlighter1_361_528_open_image.style.display="'inline';" codehighlighter1_361_528_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;c;&nbsp;b&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;i;&nbsp;b</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span style="border: 1px solid #808080; background-color: #ffffff; display: none;" id="Codehighlighter1_361_528_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_361_528_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</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;arr[a]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;arr[b]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;arr[i]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;K)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</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;arr[a]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;arr[b]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;arr[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;K)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d&nbsp;%d&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;arr[a],&nbsp;arr[b],&nbsp;arr[i]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&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 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span></div><img src ="http://www.cppblog.com/varg-vikernes/aggbug/134244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/varg-vikernes/" target="_blank">糯米</a> 2010-11-21 23:10 <a href="http://www.cppblog.com/varg-vikernes/archive/2010/11/21/134244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dinic 算法模板</title><link>http://www.cppblog.com/varg-vikernes/archive/2010/08/12/123176.html</link><dc:creator>糯米</dc:creator><author>糯米</author><pubDate>Thu, 12 Aug 2010 06:33:00 GMT</pubDate><guid>http://www.cppblog.com/varg-vikernes/archive/2010/08/12/123176.html</guid><wfw:comment>http://www.cppblog.com/varg-vikernes/comments/123176.html</wfw:comment><comments>http://www.cppblog.com/varg-vikernes/archive/2010/08/12/123176.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/varg-vikernes/comments/commentRss/123176.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/varg-vikernes/services/trackbacks/123176.html</trackback:ping><description><![CDATA[<p>Dinic算法是一种比较容易实现的，相对比较快的最大流算法。<br>今天看了一下它的原理，发现的确很牛逼。<br><br>求最大流的本质，就是不停的寻找增广路径。直到找不到增广路径为止。<br>对于这个一般性的过程，Dinic算法的优化如下：<br><br>（1）<br>Dinic算法首先对图进行一次BFS，然后在BFS生成的层次图中进行多次DFS。<br>层次图的意思就是，只有在BFS树中深度相差1的节点才是连接的。<br>这就切断了原有的图中的许多不必要的连接。很牛逼！<br>这是需要证明的，估计证明也很复杂。<br><br>（2）<br>除此之外，每次DFS完后，会找到路径中容量最小的一条边。<br>在这条边之前的路径的容量是大于等于这条边的容量的。<br>那么从这条边之前的点，可能引发出别的增广路径。<br>比如说&nbsp;S -&gt; b -&gt; c -&gt; d -&gt; T 是一条增广路径，容量最小的边是 b -&gt; c。<br>可能存在一条 S -&gt; b -&gt; e -&gt; f -&gt; g -&gt; T 这样的增广路径。<br>这样的话，在找到第一条增广路径后，只需要回溯到 b 点，就可以继续找下去了。<br>这样做的好处是，避免了找到一条路径就从头开始寻找另外一条的开销。<br>也就是再次从 S 寻找到 b 的开销。<br>这个过程看似复杂，但是代码实现起来很优雅，因为它的本质就是回溯！</p>
<br>（3）<br>在同一次 DFS 中。如果从一个点引发不出任何的增广路径，就将这个点在层次图中抹去。<br><br>而这样一个算法，实现起来居然只需要100行。太吊了。<br>我的代码是参考别人的代码写的。可以用 POJ 1273 测试。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; font-family: 宋体; background-color: #eeeeee;"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdlib.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">limits.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;MAX_VETXS&nbsp;1024</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;MAX_EDGES&nbsp;1024</span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;E[MAX_EDGES],&nbsp;next[MAX_EDGES],&nbsp;C[MAX_EDGES],&nbsp;M;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;V[MAX_VETXS],&nbsp;L[MAX_VETXS],&nbsp;Q[MAX_VETXS],&nbsp;N;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;S,&nbsp;T;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;__insert(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;from,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;to,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cap)<br><img id="Codehighlighter1_280_362_Open_Image" onclick="this.style.display='none'; codehighlighter1_280_362_open_text.style.display="'none';" codehighlighter1_280_362_closed_image.style.display="'inline';" codehighlighter1_280_362_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_280_362_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_280_362_closed_text.style.display="'none';" codehighlighter1_280_362_open_image.style.display="'inline';" codehighlighter1_280_362_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_280_362_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_280_362_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;M</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;C[M]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cap;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;E[M]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;to;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;next[M]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;V[from];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;V[from]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;M;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;insert(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;from,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;to,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;cap)<br><img id="Codehighlighter1_404_462_Open_Image" onclick="this.style.display='none'; codehighlighter1_404_462_open_text.style.display="'none';" codehighlighter1_404_462_closed_image.style.display="'inline';" codehighlighter1_404_462_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_404_462_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_404_462_closed_text.style.display="'none';" codehighlighter1_404_462_open_image.style.display="'inline';" codehighlighter1_404_462_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_404_462_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_404_462_Open_Text"><span style="color: #000000;">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;__insert(from,&nbsp;to,&nbsp;cap);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;__insert(to,&nbsp;from,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;bfs()<br><img id="Codehighlighter1_475_830_Open_Image" onclick="this.style.display='none'; codehighlighter1_475_830_open_text.style.display="'none';" codehighlighter1_475_830_closed_image.style.display="'inline';" codehighlighter1_475_830_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_475_830_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_475_830_closed_text.style.display="'none';" codehighlighter1_475_830_open_image.style.display="'inline';" codehighlighter1_475_830_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_475_830_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_475_830_Open_Text"><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;">int</span><span style="color: #000000;">&nbsp;h,&nbsp;t,&nbsp;e,&nbsp;u,&nbsp;v;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;h&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;Q[t</span><span style="color: #000000;">++</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;S;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;memset(L,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;N</span><span style="color: #000000;">*</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(L[</span><span style="color: #000000;">0</span><span style="color: #000000;">]));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;L[S]&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 id="Codehighlighter1_599_810_Open_Image" onclick="this.style.display='none'; codehighlighter1_599_810_open_text.style.display="'none';" codehighlighter1_599_810_closed_image.style.display="'inline';" codehighlighter1_599_810_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_599_810_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_599_810_closed_text.style.display="'none';" codehighlighter1_599_810_open_image.style.display="'inline';" codehighlighter1_599_810_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(h&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;t)&nbsp;</span><span id="Codehighlighter1_599_810_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_599_810_Open_Text"><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;u&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Q[h</span><span style="color: #000000;">++</span><span style="color: #000000;">];<br><img id="Codehighlighter1_660_804_Open_Image" onclick="this.style.display='none'; codehighlighter1_660_804_open_text.style.display="'none';" codehighlighter1_660_804_closed_image.style.display="'inline';" codehighlighter1_660_804_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_660_804_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_660_804_closed_text.style.display="'none';" codehighlighter1_660_804_open_image.style.display="'inline';" codehighlighter1_660_804_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(e&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;V[u];&nbsp;e;&nbsp;e&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;next[e])&nbsp;</span><span id="Codehighlighter1_660_804_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_660_804_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;E[e];<br><img id="Codehighlighter1_719_794_Open_Image" onclick="this.style.display='none'; codehighlighter1_719_794_open_text.style.display="'none';" codehighlighter1_719_794_closed_image.style.display="'inline';" codehighlighter1_719_794_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_719_794_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_719_794_closed_text.style.display="'none';" codehighlighter1_719_794_open_image.style.display="'inline';" codehighlighter1_719_794_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">L[v]&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;C[e]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;</span><span id="Codehighlighter1_719_794_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_719_794_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L[v]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;L[u]&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[t</span><span style="color: #000000;">++</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;v;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;L[T];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dfs()<br><img id="Codehighlighter1_843_1708_Open_Image" onclick="this.style.display='none'; codehighlighter1_843_1708_open_text.style.display="'none';" codehighlighter1_843_1708_closed_image.style.display="'inline';" codehighlighter1_843_1708_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_843_1708_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_843_1708_closed_text.style.display="'none';" codehighlighter1_843_1708_open_image.style.display="'inline';" codehighlighter1_843_1708_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_843_1708_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_843_1708_Open_Text"><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;">int</span><span style="color: #000000;">&nbsp;t,&nbsp;u,&nbsp;v,&nbsp;e,&nbsp;i,&nbsp;f,&nbsp;r,&nbsp;back;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;t&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;r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_918_1691_Open_Image" onclick="this.style.display='none'; codehighlighter1_918_1691_open_text.style.display="'none';" codehighlighter1_918_1691_closed_image.style.display="'inline';" codehighlighter1_918_1691_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_918_1691_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_918_1691_closed_text.style.display="'none';" codehighlighter1_918_1691_open_image.style.display="'inline';" codehighlighter1_918_1691_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(t)&nbsp;</span><span id="Codehighlighter1_918_1691_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_918_1691_Open_Text"><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;u&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(t&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;S&nbsp;:&nbsp;E[Q[t&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 id="Codehighlighter1_980_1379_Open_Image" onclick="this.style.display='none'; codehighlighter1_980_1379_open_text.style.display="'none';" codehighlighter1_980_1379_closed_image.style.display="'inline';" codehighlighter1_980_1379_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_980_1379_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_980_1379_closed_text.style.display="'none';" codehighlighter1_980_1379_open_image.style.display="'inline';" codehighlighter1_980_1379_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(u&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;T)&nbsp;</span><span id="Codehighlighter1_980_1379_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_980_1379_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;INT_MAX;<br><img id="Codehighlighter1_1043_1193_Open_Image" onclick="this.style.display='none'; codehighlighter1_1043_1193_open_text.style.display="'none';" codehighlighter1_1043_1193_closed_image.style.display="'inline';" codehighlighter1_1043_1193_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1043_1193_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1043_1193_closed_text.style.display="'none';" codehighlighter1_1043_1193_open_image.style.display="'inline';" codehighlighter1_1043_1193_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;t;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span id="Codehighlighter1_1043_1193_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1043_1193_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Q[i];<br><img id="Codehighlighter1_1101_1179_Open_Image" onclick="this.style.display='none'; codehighlighter1_1101_1179_open_text.style.display="'none';" codehighlighter1_1101_1179_closed_image.style.display="'inline';" codehighlighter1_1101_1179_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1101_1179_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1101_1179_closed_text.style.display="'none';" codehighlighter1_1101_1179_open_image.style.display="'inline';" codehighlighter1_1101_1179_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(C[e]&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;f)&nbsp;</span><span id="Codehighlighter1_1101_1179_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1101_1179_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;C[e];<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;back&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img id="Codehighlighter1_1231_1327_Open_Image" onclick="this.style.display='none'; codehighlighter1_1231_1327_open_text.style.display="'none';" codehighlighter1_1231_1327_closed_image.style.display="'inline';" codehighlighter1_1231_1327_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1231_1327_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1231_1327_closed_text.style.display="'none';" codehighlighter1_1231_1327_open_image.style.display="'inline';" codehighlighter1_1231_1327_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;t;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span id="Codehighlighter1_1231_1327_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1231_1327_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Q[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;&nbsp;&nbsp;&nbsp;&nbsp;C[e]&nbsp;</span><span style="color: #000000;">-=</span><span style="color: #000000;">&nbsp;f;<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;&nbsp;&nbsp;&nbsp;&nbsp;C[e</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;">&nbsp;f;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></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;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;f;<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;t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;back;<br><img id="Codehighlighter1_1386_1685_Open_Image" onclick="this.style.display='none'; codehighlighter1_1386_1685_open_text.style.display="'none';" codehighlighter1_1386_1685_closed_image.style.display="'inline';" codehighlighter1_1386_1685_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1386_1685_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1386_1685_closed_text.style.display="'none';" codehighlighter1_1386_1685_open_image.style.display="'inline';" codehighlighter1_1386_1685_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_1386_1685_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1386_1685_Open_Text"><span style="color: #000000;">{<br><img id="Codehighlighter1_1431_1548_Open_Image" onclick="this.style.display='none'; codehighlighter1_1431_1548_open_text.style.display="'none';" codehighlighter1_1431_1548_closed_image.style.display="'inline';" codehighlighter1_1431_1548_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1431_1548_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1431_1548_closed_text.style.display="'none';" codehighlighter1_1431_1548_open_image.style.display="'inline';" codehighlighter1_1431_1548_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(e&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;V[u];&nbsp;e;&nbsp;e&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;next[e])&nbsp;</span><span id="Codehighlighter1_1431_1548_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1431_1548_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;E[e];<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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(L[v]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;L[u]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;C[e]&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</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;&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 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(e)<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;&nbsp;&nbsp;&nbsp;&nbsp;Q[t</span><span style="color: #000000;">++</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;e;<br><img id="Codehighlighter1_1614_1675_Open_Image" onclick="this.style.display='none'; codehighlighter1_1614_1675_open_text.style.display="'none';" codehighlighter1_1614_1675_closed_image.style.display="'inline';" codehighlighter1_1614_1675_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1614_1675_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1614_1675_closed_text.style.display="'none';" codehighlighter1_1614_1675_open_image.style.display="'inline';" codehighlighter1_1614_1675_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_1614_1675_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1614_1675_Open_Text"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L[u]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;r;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;dinic()<br><img id="Codehighlighter1_1723_1794_Open_Image" onclick="this.style.display='none'; codehighlighter1_1723_1794_open_text.style.display="'none';" codehighlighter1_1723_1794_closed_image.style.display="'inline';" codehighlighter1_1723_1794_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_1723_1794_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1723_1794_closed_text.style.display="'none';" codehighlighter1_1723_1794_open_image.style.display="'inline';" codehighlighter1_1723_1794_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_1723_1794_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1723_1794_Open_Text"><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;">int</span><span style="color: #000000;">&nbsp;f&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(bfs())<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;dfs();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;f;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br><img id="Codehighlighter1_1808_2201_Open_Image" onclick="this.style.display='none'; codehighlighter1_1808_2201_open_text.style.display="'none';" codehighlighter1_1808_2201_closed_image.style.display="'inline';" codehighlighter1_1808_2201_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_1808_2201_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1808_2201_closed_text.style.display="'none';" codehighlighter1_1808_2201_open_image.style.display="'inline';" codehighlighter1_1808_2201_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_1808_2201_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1808_2201_Open_Text"><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;">int</span><span style="color: #000000;">&nbsp;n,&nbsp;m,&nbsp;a,&nbsp;b,&nbsp;c,&nbsp;i;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000;">"</span><span style="color: #000000;">d:\\in.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">r</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;stdin);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img id="Codehighlighter1_1920_2184_Open_Image" onclick="this.style.display='none'; codehighlighter1_1920_2184_open_text.style.display="'none';" codehighlighter1_1920_2184_closed_image.style.display="'inline';" codehighlighter1_1920_2184_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_1920_2184_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_1920_2184_closed_text.style.display="'none';" codehighlighter1_1920_2184_open_image.style.display="'inline';" codehighlighter1_1920_2184_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(scanf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d%d</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">n,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">m)&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;EOF)&nbsp;</span><span id="Codehighlighter1_1920_2184_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_1920_2184_Open_Text"><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;S&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</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;T&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;m;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(V,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;N</span><span style="color: #000000;">*</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(V[</span><span style="color: #000000;">0</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;M&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">;<br><img id="Codehighlighter1_2056_2144_Open_Image" onclick="this.style.display='none'; codehighlighter1_2056_2144_open_text.style.display="'none';" codehighlighter1_2056_2144_closed_image.style.display="'inline';" codehighlighter1_2056_2144_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_2056_2144_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_2056_2144_closed_text.style.display="'none';" codehighlighter1_2056_2144_open_image.style.display="'inline';" codehighlighter1_2056_2144_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;n;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;</span><span id="Codehighlighter1_2056_2144_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id="Codehighlighter1_2056_2144_Open_Text"><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;&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;">a,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">b,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">c);<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;insert(a&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;b&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></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;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;dinic());<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&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 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}</span></span><span style="color: #000000;"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></span></div>
<br><img src ="http://www.cppblog.com/varg-vikernes/aggbug/123176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/varg-vikernes/" target="_blank">糯米</a> 2010-08-12 14:33 <a href="http://www.cppblog.com/varg-vikernes/archive/2010/08/12/123176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>KMP 演示程序</title><link>http://www.cppblog.com/varg-vikernes/archive/2010/04/29/113948.html</link><dc:creator>糯米</dc:creator><author>糯米</author><pubDate>Thu, 29 Apr 2010 04:48:00 GMT</pubDate><guid>http://www.cppblog.com/varg-vikernes/archive/2010/04/29/113948.html</guid><wfw:comment>http://www.cppblog.com/varg-vikernes/comments/113948.html</wfw:comment><comments>http://www.cppblog.com/varg-vikernes/archive/2010/04/29/113948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/varg-vikernes/comments/commentRss/113948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/varg-vikernes/services/trackbacks/113948.html</trackback:ping><description><![CDATA[下面这个小程序，可以演示 KMP 的匹配过程。<br>一直没有真正理解这个算法，昨天看了下算法导论。才懂了。<br>确实是一个相当精辟，相当巧妙的算法。太牛逼了！<br><br>
<div><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;&lt;stdio.h&gt;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#include&nbsp;&lt;string.h&gt;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">#define&nbsp;MAX_LEN&nbsp;256<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">int&nbsp;tbl[MAX_LEN];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">char&nbsp;*str&nbsp;=&nbsp;"abbbbbbb";<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">char&nbsp;*ptn&nbsp;=&nbsp;"bb";<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">char&nbsp;spc[MAX_LEN];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top">int&nbsp;main()<br><img id="Codehighlighter1_152_927_Open_Image" onclick="this.style.display='none'; codehighlighter1_152_927_open_text.style.display="'none';" codehighlighter1_152_927_closed_image.style.display="'inline';" codehighlighter1_152_927_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_152_927_Closed_Image" onclick="this.style.display='none'; codehighlighter1_152_927_closed_text.style.display="'none';" codehighlighter1_152_927_open_image.style.display="'inline';" codehighlighter1_152_927_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,&nbsp;j;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;memset(spc,&nbsp;'&nbsp;',&nbsp;sizeof(spc));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;tbl[0]&nbsp;=&nbsp;0;<br><img id="Codehighlighter1_238_346_Open_Image" onclick="this.style.display='none'; codehighlighter1_238_346_open_text.style.display="'none';" codehighlighter1_238_346_closed_image.style.display="'inline';" codehighlighter1_238_346_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_238_346_Closed_Image" onclick="this.style.display='none'; codehighlighter1_238_346_closed_text.style.display="'none';" codehighlighter1_238_346_open_image.style.display="'inline';" codehighlighter1_238_346_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;1;&nbsp;ptn[i];&nbsp;i++)&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j&nbsp;=&nbsp;tbl[i&nbsp;-&nbsp;1];&nbsp;j&nbsp;&amp;&amp;&nbsp;ptn[j]&nbsp;!=&nbsp;ptn[i];&nbsp;j&nbsp;=&nbsp;tbl[j]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ptn[j]&nbsp;==&nbsp;ptn[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;j++;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tbl[i]&nbsp;=&nbsp;j;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;printf("table:\n");<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;ptn[i];&nbsp;i++)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;&nbsp;%c",&nbsp;ptn[i]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;ptn[i];&nbsp;i++)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%3d",&nbsp;tbl[i]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;0;<br><img id="Codehighlighter1_538_913_Open_Image" onclick="this.style.display='none'; codehighlighter1_538_913_open_text.style.display="'none';" codehighlighter1_538_913_closed_image.style.display="'inline';" codehighlighter1_538_913_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_538_913_Closed_Image" onclick="this.style.display='none'; codehighlighter1_538_913_closed_text.style.display="'none';" codehighlighter1_538_913_open_image.style.display="'inline';" codehighlighter1_538_913_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;str[i];&nbsp;)&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\nmatching&nbsp;#%d\n",&nbsp;i);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;str);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(spc,&nbsp;1,&nbsp;i&nbsp;-&nbsp;j,&nbsp;stdout);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;ptn);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(spc,&nbsp;1,&nbsp;i,&nbsp;stdout);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("^\n");<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;<br><img id="Codehighlighter1_729_769_Open_Image" onclick="this.style.display='none'; codehighlighter1_729_769_open_text.style.display="'none';" codehighlighter1_729_769_closed_image.style.display="'inline';" codehighlighter1_729_769_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_729_769_Closed_Image" onclick="this.style.display='none'; codehighlighter1_729_769_closed_text.style.display="'none';" codehighlighter1_729_769_open_image.style.display="'inline';" codehighlighter1_729_769_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(str[i]&nbsp;==&nbsp;ptn[j])&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<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;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;j++;<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;printf("ok\n");<br><img id="Codehighlighter1_776_861_Open_Image" onclick="this.style.display='none'; codehighlighter1_776_861_open_text.style.display="'none';" codehighlighter1_776_861_closed_image.style.display="'inline';" codehighlighter1_776_861_closed_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_776_861_Closed_Image" onclick="this.style.display='none'; codehighlighter1_776_861_closed_text.style.display="'none';" codehighlighter1_776_861_open_image.style.display="'inline';" codehighlighter1_776_861_open_text.style.display="'inline';"" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">{<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;if&nbsp;(j)&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;tbl[j&nbsp;-&nbsp;1];<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;else<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;&nbsp;&nbsp;&nbsp;&nbsp;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;printf("jumped&nbsp;to&nbsp;%d\n",&nbsp;j);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!ptn[j])<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;printf("matched&nbsp;at&nbsp;%d\n",&nbsp;i);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top">}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"></div>
<p><br><br>输出：<br>table:<br>&nbsp; b&nbsp; b<br>&nbsp; 0&nbsp; 1</p>
<p style="font-family: 宋体;">matching #0<br>abbbbbbb<br>bb<br>^<br>jumped to 0</p>
<p style="font-family: 宋体;">matching #1<br>abbbbbbb<br>&nbsp;bb<br>&nbsp;^<br>ok</p>
<p style="font-family: 宋体;">matching #2<br>abbbbbbb<br>&nbsp;bb<br>&nbsp; ^<br>ok<br>matched at 3</p>
<p style="font-family: 宋体;">matching #3<br>abbbbbbb<br>&nbsp;bb<br>&nbsp;&nbsp; ^<br>jumped to 1</p>
<p style="font-family: 宋体;">matching #3<br>abbbbbbb<br>&nbsp; bb<br>&nbsp;&nbsp; ^<br>ok<br>matched at 4</p>
<p style="font-family: 宋体;">matching #4<br>abbbbbbb<br>&nbsp; bb<br>&nbsp;&nbsp;&nbsp; ^<br>jumped to 1</p>
<p style="font-family: 宋体;">matching #4<br>abbbbbbb<br>&nbsp;&nbsp; bb<br>&nbsp;&nbsp;&nbsp; ^<br>ok<br>matched at 5</p>
<p style="font-family: 宋体;">matching #5<br>abbbbbbb<br>&nbsp;&nbsp; bb<br>&nbsp;&nbsp;&nbsp;&nbsp; ^<br>jumped to 1</p>
<p style="font-family: 宋体;">matching #5<br>abbbbbbb<br>&nbsp;&nbsp;&nbsp; bb<br>&nbsp;&nbsp;&nbsp;&nbsp; ^<br>ok<br>matched at 6</p>
<p style="font-family: 宋体;">matching #6<br>abbbbbbb<br>&nbsp;&nbsp;&nbsp; bb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^<br>jumped to 1</p>
<p style="font-family: 宋体;">matching #6<br>abbbbbbb<br>&nbsp;&nbsp;&nbsp;&nbsp; bb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^<br>ok<br>matched at 7</p>
<p style="font-family: 宋体;">matching #7<br>abbbbbbb<br>&nbsp;&nbsp;&nbsp;&nbsp; bb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^<br>jumped to 1</p>
<p style="font-family: 宋体;">matching #7<br>abbbbbbb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bb<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^<br>ok<br>matched at 8</p><img src ="http://www.cppblog.com/varg-vikernes/aggbug/113948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/varg-vikernes/" target="_blank">糯米</a> 2010-04-29 12:48 <a href="http://www.cppblog.com/varg-vikernes/archive/2010/04/29/113948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]LCA问题（含RMQ的ST算法） </title><link>http://www.cppblog.com/varg-vikernes/archive/2010/03/10/109355.html</link><dc:creator>糯米</dc:creator><author>糯米</author><pubDate>Wed, 10 Mar 2010 06:14:00 GMT</pubDate><guid>http://www.cppblog.com/varg-vikernes/archive/2010/03/10/109355.html</guid><wfw:comment>http://www.cppblog.com/varg-vikernes/comments/109355.html</wfw:comment><comments>http://www.cppblog.com/varg-vikernes/archive/2010/03/10/109355.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/varg-vikernes/comments/commentRss/109355.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/varg-vikernes/services/trackbacks/109355.html</trackback:ping><description><![CDATA[转自: <a href="http://www.cppblog.com/Icyflame/">http://www.cppblog.com/Icyflame/</a><br><br>
<p><strong>一、定义与定理<br></strong><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LCA：Least Common Ancestors（最近公共祖先），对于一棵有根树T的任意两个节点u，v，求出LCA(T, u, v)，即离跟最远的节点x，使得x同时是u和v的祖先。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在线算法：用比较长的时间做预处理，但是等信息充足以后每次回答询问只需要用比较少的时间。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;离线算法：先把所有的询问读入，然后一起把所有询问回答完成。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RMQ：给出一个数组A，回答询问RMQ(A, i, j)，即A[i...j]之间的最值的下标。<br></span><strong>二、DFS+RMQ</strong><br><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）Sparse Table（ST）算法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>描述：</strong><br></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">初始化</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">INIT_RMQ<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">max[i][j]中存的是重j开始的i个数据中的最大值，最小值类似，num中存有数组的值</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;to&nbsp;n<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max[</span><span style="color: #000000;">0</span><span style="color: #000000;">][i]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;num[i]<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;to&nbsp;log(n)</span><span style="color: #000000;">/</span><span style="color: #000000;">log(</span><span style="color: #000000;">2</span><span style="color: #000000;">)<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;j&nbsp;:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;to&nbsp;n<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max[i][j]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MAX(max[i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">][j],&nbsp;max[i</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">][j</span><span style="color: #000000;">+</span><span style="color: #000000;">2</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;">)]<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">查询</span><span style="color: #008000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">RMQ(i,&nbsp;j)<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log(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;">)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;log(</span><span style="color: #000000;">2</span><span style="color: #000000;">)<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;MAX(max[k][i],&nbsp;max[k][j</span><span style="color: #000000;">-</span><span style="color: #000000;">2</span><span style="color: #000000;">^</span><span style="color: #000000;">k</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">])</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>分析：</strong>初始化过程实际上是一个动态规划的思想。易知，初始化过程效率是O(<em>n</em>log<em>n</em>)，而查询过程效率是O(1)。ST是一个在线算法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>示例：</strong><a title="POJ 3368 解题报告" href="http://www.cppblog.com/Icyflame/archive/2009/07/01/88999.html"><u><font color="#56b6e9">POJ 3368 解题报告</font></u></a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）求解LCA问题<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>描述：</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（1）DFS：从树T的根开始，进行深度优先遍历，并记录下每次到达的顶点。第一个的结点是root(T)，每经过一条边都记录它的端点。由于每条边恰好经过2次，因此一共记录了2n-1个结点，用E[1, ... , 2n-1]来表示。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（2）计算R：用R[i]表示E数组中第一个值为i的元素下标，即如果R[u] &lt; R[v]时，DFS访问的顺序是E[R[u], R[u]+1, ..., R[v]]。虽然其中包含u的后代，但深度最小的还是u与v的公共祖先。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（3）RMQ：当R[u] &#8805; R[v]时，LCA[T, u, v] = RMQ(L, R[v], R[u])；否则LCA[T, u, v] = RMQ(L, R[u], R[v])，计算RMQ。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于RMQ中使用的ST算法是在线算法，所以这个算法也是在线算法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>示例：</strong><a title="ZOJ 3195 解题报告" href="http://www.cppblog.com/Icyflame/archive/2009/07/02/89107.html"><u><font color="#56b6e9">ZOJ 3195 解题报告</font></u></a>。<br><strong><font size="2">三、Tarjan算法<br></font></strong><span style="font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>描述：</strong>Tarjan算法是一个离线算法，也就是说只有先获得所有的查询，再按一个特定的顺序进行运算。</span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #008000;">//</span><span style="color: #008000;">parent为并查集，FIND为并查集的查找操作</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">Tarjan(u)<br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;visit[u]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;each&nbsp;(u,&nbsp;v)&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;QUERY<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;visit[v]<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans(u,&nbsp;v)&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FIND(v)<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;each&nbsp;(u,&nbsp;v)&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;TREE&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">visit[v]<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tarjan(v)<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent[v]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;u</span></div>
<font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>示例：</strong></font><a title="HDOJ 2586 解题报告" href="http://www.cppblog.com/Icyflame/archive/2009/07/02/89118.html"><u><font color="#56b6e9" size="2">HDOJ 2586 解题报告</font></u></a><font size="2">。 </font><img src ="http://www.cppblog.com/varg-vikernes/aggbug/109355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/varg-vikernes/" target="_blank">糯米</a> 2010-03-10 14:14 <a href="http://www.cppblog.com/varg-vikernes/archive/2010/03/10/109355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>