﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Mato is No.1-随笔分类-算法效率实验</title><link>http://www.cppblog.com/MatoNo1/category/16322.html</link><description>Mato是一只超级大沙茶……但他一直以来都想成为各项比赛都No.1的神犇……</description><language>zh-cn</language><lastBuildDate>Mon, 03 Dec 2012 23:45:52 GMT</lastBuildDate><pubDate>Mon, 03 Dec 2012 23:45:52 GMT</pubDate><ttl>60</ttl><item><title>【AHOI2013复仇】关于线段树下标的一种优化表示法</title><link>http://www.cppblog.com/MatoNo1/archive/2012/12/01/195857.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 01 Dec 2012 04:11:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2012/12/01/195857.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/195857.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2012/12/01/195857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/195857.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/195857.html</trackback:ping><description><![CDATA[在线段树中，一般都不需要刻意保存其左右子结点的下标，而直接由其本身的下标导出，传统的写法是：<br />根结点：1<br />A的左子结点：2A（写成A&lt;&lt;1）<br />A的右子结点：2A+1（写成(A&lt;&lt;1)+1）<br />这种表示法可以表示出整棵线段树，因为：<br />（1）每个结点的子结点的下标都比它大，这样就不会出现环；<br />（2）每个结点的父结点都是唯一的（其本身下标整除2）；<br />但是，这种表示法有一个弱点：结点的下标是有可能超过2N的，但不会超过4N，因此，为了表示出跨度为N的线段，我们需要开4N的空间，然而，其中只有2N-1个位置是有用的（因为表示跨度为N的线段的线段树共有(2N-1)个结点），<span style="color: red"><strong>这样，就有一半的空间被浪费</strong></span>。尤其是这种线段树推广到多维的时候&#8212;&#8212;K维线段树就只有1/2<sup>K</sup>的位置是有用的，空间利用率非常低。在某些卡空间的场合，它就囧掉了。<br /><br />那么，有木有好一点的写法呢？最好能使空间利用率达到100%&#8212;&#8212;也就是所有结点的下标刚好就是1~(2N-1)！！（0号结点一般作为&#8220;哨兵&#8221;，不被占用）<br />并且，这种写法要保证仅仅由结点的下标和它表示的线段的左右端点（因为在遍历线段时，下标和左右端点基本上都是同时知道的），就能得出其子结点的下标，而不需要借助额外的东东（最好mid都不需要算）。<br />这种写法就是&#8212;&#8212;<strong><span style="color: red">直接将每个结点的DFS遍历次序当做它的下标！！</span><br /></strong>比如，跨度为6的线段树：<br /><img alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/描述所用图片/新式线段树.jpg" border="0" height="200" width="235" /><br />容易发现，根结点下标为1，下标为A的结点的左子结点下标为(A+1)，右子结点下标为A+SZ(A.L)+1，其中SZ(A.L)为A的左子树大小。<br />若A的左右端点为l、r，mid=(l+r)/2（下取整），则A的左子树所表示的线段为[l, mid]，所以SZ(A.L)=(mid-l+1)*2-1=(mid-l)*2+1=((r-l-1)/2（上取整）)*2+1<br />这样，A的右子结点下标就是A+((r-l+1)/2（上取整))*2，也就是<span style="color: red"><strong>A加上大于(r-l)的最小的偶数</strong></span>；<br />写在代码里就是： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mid</span><span style="color: #000000">=</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />opr(l,&nbsp;mid,&nbsp;A</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);<br />opr(mid</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r,&nbsp;(r</span><span style="color: #000000">-</span><span style="color: #000000">l</span><span style="color: #000000">&amp;</span><span style="color: #000000">1</span><span style="color: #000000">?</span><span style="color: #000000">A</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">-</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">:A</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">-</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">2</span><span style="color: #000000">));</span></div>或者，借助位运算，可以免去条件判断： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mid</span><span style="color: #000000">=</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />opr(l,&nbsp;mid,&nbsp;A</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">);<br />opr(mid</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r,&nbsp;A</span><span style="color: #000000">+</span><span style="color: #000000">r</span><span style="color: #000000">-</span><span style="color: #000000">l</span><span style="color: #000000">+</span><span style="color: #000000">2</span><span style="color: #000000">-</span><span style="color: #000000">((r</span><span style="color: #000000">^</span><span style="color: #000000">l)</span><span style="color: #000000">&amp;</span><span style="color: #000000">1</span><span style="color: #000000">));</span></div>经测试，后者（使用位运算的）虽然总的运算次数多于前者（使用条件判断的），但后者比前者快一点点，其原因可能与C语言中的条件运算符速度较慢有关；<br /><br />这样，我们就成功地将线段树下标的空间利用率提高到了100%！！以后只需要开2N空间就行了囧&#8230;&#8230;<br />与传统表示法相比，这种新式表示法虽然可以节省空间，但时间消耗要更大一些（时间和空间总是矛盾的囧&#8230;&#8230;），因为它在找右子结点的时候需要较多的运算。平均起来，新式表示法比传统表示法要慢10~15%，对于某些坑爹的数据（对右子结点调用比较多的那种）可能慢得更多。此外，在下放标记的时候，传统表示法只需要知道结点下标就行了，而新式表示法必须同时知道结点的左右端点，这样在dm中就需要传递三个参数，从而要慢一些，当然，我们可以不用dm，直接在操作里面写标记下放。<img src ="http://www.cppblog.com/MatoNo1/aggbug/195857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2012-12-01 12:11 <a href="http://www.cppblog.com/MatoNo1/archive/2012/12/01/195857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【NOI2005 维护数列(sequence)】Splay Tree处理序列问题</title><link>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Tue, 21 Jun 2011 08:06:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/149121.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/149121.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/149121.html</trackback:ping><description><![CDATA[<div>【原题见<a title="这里" href="http://mail.bashu.cn:8080/BSoiOnline/showproblem?problem_id=2246">这里</a>】<br />本题是Splay Tree处理序列问题（也就是当线段树用）的一个典型例题。<br /><br />Splay Tree之所以可以当线段树用，是因为它可以支持一个序列，然后用&#8220;左端前趋伸展到根，右端后继伸展到根的右子结点，取根的右子结点的左子结点&#8221;这种伸展方法，对一个序列中的一整段进行整体操作。由于要防止出现前趋或后继不存在的情况，需要在这个序列的两端加入两个边界结点，要求其值不能影响到结点各种记载信息的维护（多取0、&#8734;或-&#8734;）。这两个边界结点在树中永远存在，不会被删除。<br /><br />（1）结点的引用：<br />在当线段树用的Splay Tree中，真正的关键字是下标而不是值，因此，&#8220;序列中第i个结点&#8221;实际上对应的是&#8220;树中第(i+1)小的结点&#8221;（因为左边还有一个边界结点），这就说明在对结点引用时需要找第K小的操作。因此，下面的&#8220;结点x&#8221;指的是&#8220;树中第(x+1)小的结点&#8221;。<br />（2）标记：<br />在线段树中，如果对一个结点所表示的线段整体进行了某种操作，需要在这个结点上打上一个标记，在下一次再找到这个结点时，其标记就会下放到其两个子结点上。在Splay Tree中也可以引入标记。比如要对[2, 6]这一段进行整体操作，就将结点1伸展到根的位置，将结点7伸展到根的右子树的位置，然后结点7的左子树就表示[2, 6]这一段，对这棵子树的根结点打上标记并立即生效（必须是立即生效，而不是等下一次引用再生效），也就是立即改变该结点记录的一些信息的值。如果下次再次引用到这个结点，就要将其标记下放到其两个子结点处；<br />需要注意的一点是，如果要伸展某个结点x到r的子结点的位置，就必须保证从x原来的位置到r的这个子结点（x伸展后的位置）上的所有结点上均没有标记，否则就会导致标记混乱。因此，必须首先找到这个结点x，在此过程中不断下放标记。<br />（3）自底向上维护的信息：<br />标记可以看成一种自顶向下维护的信息。除了标记以外，作为&#8220;线段树&#8221;，往往还要维护一些自底向上维护的信息。比如在sequence这题中，就有lmax（左段连续最大和）、rmax（右段连续最大和）、midmax（全段连续最大和）以及sum（全段总和）等信息要维护。对于这类东东其实也很好办，因为子树大小（sz域）就是一种自底向上维护的信息，因此对于这些信息只要按照维护sz域的办法维护即可（统一写在upd函数里）。唯一的不同点是打标记时它们的值可能要改变。<br />（4）对连续插入的结点建树：<br />本题的插入不是一个一个插入，而是一下子插入一整段，因此需要先将它们建成一棵树。一般建树操作都是递归的，这里也一样。设目前要对A[l..r]建树（A为待插入序列），若l&gt;r则退出，否则找到位于中间的元素mid = l + r &gt;&gt; 1，将A[mid]作根，再对A[l..mid-1]建左子树，对A[mid+1..r]建右子树即可。这样可以保证一开始建的就是一棵平衡树，减小常数因子。<br />（5）回收空间：<br />根据本题的数据范围提示，插入的结点总数最多可能达到4000000，但在任何时刻树中最多只有500002个结点（包括两个边界），此时为了节省空间，可以采用循环队列回收空间的方法。即：一开始将所有的可用空间（可用下标，本题为1~500002）存在循环队列Q里，同时设立头尾指针front和rear，每次如果有新结点插入，就取出Q[front]并作为新结点的下标，如果有结点要删除（本题是一次删除整棵子树，因此在删除后需要分别回收它们的空间），则从rear开始，将每个删除的结点的下标放回到Q里。当然，这种方法是要牺牲一定的时间的，因此在空间不是特别吃紧的情况下不要用。<br /><br />【2012年1月16日更新】<br />今天重写sequence的时候，秃然发现加入的边界点可能会对lmax、rmax、midmax等的维护造成影响：当序列中所有的值都是负数时，若边界点的值设为0，将使这3个值也为0，所以，边界点的值应设为-INF（不会影响到sum，因为可以单独调出[l, r]的sum，避开边界）。这就说明并非所有这样的题中都可以设置边界点（比如HFTSC2011的那题就不行），如果边界点会对维护的信息造成影响，就不能设置边界点，在各个操作中，分4种情况判断。（代码已经修改）<br /><br />下面上代码了： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re1(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=1;&nbsp;i&lt;=n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">500002</span><span style="color: #000000">,&nbsp;NOSM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">2000</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;node&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;v,&nbsp;c[</span><span style="color: #000000">2</span><span style="color: #000000">],&nbsp;p,&nbsp;sz,&nbsp;sum,&nbsp;lmax,&nbsp;rmax,&nbsp;midmax,&nbsp;sm;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;rev,&nbsp;d;<br />}&nbsp;T[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;root,&nbsp;Q[MAXN&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;front,&nbsp;rear,&nbsp;a[MAXN],&nbsp;len,&nbsp;res;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS0,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS1)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SS0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;SS1&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;SS0&nbsp;:&nbsp;SS1;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS0,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS1,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SS2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;M0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SS0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;SS1&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;SS0&nbsp;:&nbsp;SS1;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;M0&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;SS2&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;M0&nbsp;:&nbsp;SS2;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;newnode(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_v)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[n].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_v;&nbsp;T[n].c[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[n].c[</span><span style="color: #000000">1</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;T[n].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;T[n].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NOSM;&nbsp;T[n].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sc(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_p,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_c,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;_d)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[_p].c[_d]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_c;&nbsp;T[_c].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_p;&nbsp;T[_c].d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_d;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sm_opr(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SM)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;SM;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SM&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;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].sum;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SM;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rev_opr(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">];&nbsp;sc(x,&nbsp;c0,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;sc(x,&nbsp;c1,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].lmax;&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].rmax;&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;dm(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;SM0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].sm;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SM0&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NOSM)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[x].v&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SM0;&nbsp;T[x].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NOSM;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sm_opr(T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;SM0);&nbsp;sm_opr(T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">],&nbsp;SM0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[x].rev)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T[T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">T[T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].rev;&nbsp;T[T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">T[T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]].rev;&nbsp;T[x].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rev_opr(T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]);&nbsp;rev_opr(T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;upd(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">],&nbsp;c1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[c0].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[c1].sz&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;T[x].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[c0].sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[c1].sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v;<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(T[c0].lmax,&nbsp;T[c0].sum&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;max(T[c1].lmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(T[c1].rmax,&nbsp;max(T[c0].rmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[c1].sum);<br />&nbsp;&nbsp;&nbsp;&nbsp;T[x].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(T[c0].midmax,&nbsp;T[c1].midmax,&nbsp;max(T[c0].rmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;T[x].v&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;max(T[c1].lmax,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">));<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;rot(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;d&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].d;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(y&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;root)&nbsp;{root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;T[root].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;sc(T[y].p,&nbsp;x,&nbsp;T[y].d);<br />&nbsp;&nbsp;&nbsp;&nbsp;sc(y,&nbsp;T[x].c[</span><span style="color: #000000">!</span><span style="color: #000000">d],&nbsp;d);&nbsp;sc(x,&nbsp;y,&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">d);&nbsp;upd(y);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;splay(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;((p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[x].p)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;r)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[p].p&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r)&nbsp;rot(x);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(T[x].d&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;T[p].d)&nbsp;{rot(p);&nbsp;rot(x);}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{rot(x);&nbsp;rot(x);}&nbsp;upd(x);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Find_Kth(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;K)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;root,&nbsp;S0;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dm(i);&nbsp;S0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[T[i].c[</span><span style="color: #000000">0</span><span style="color: #000000">]].sz&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;S0)&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(K&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;S0)&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{K&nbsp;</span><span style="color: #000000">-=</span><span style="color: #000000">&nbsp;S0;&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[i].c[</span><span style="color: #000000">1</span><span style="color: #000000">];}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;i;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mkt(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;r)&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 />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Q[front],&nbsp;mid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(front&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;MAXN)&nbsp;front&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;newnode(n0,&nbsp;a[mid]);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l_r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(l,&nbsp;mid&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">),&nbsp;r_r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mkt(mid&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;r);<br />&nbsp;&nbsp;&nbsp;&nbsp;sc(n0,&nbsp;l_r,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;sc(n0,&nbsp;r_r,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;upd(n0);&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;n0;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ins(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;pos)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(pos);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(pos&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;sc(P1,&nbsp;mkt(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;len&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">),&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;upd(P1);&nbsp;upd(P0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;era(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">x)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rear&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;MAXN)&nbsp;rear&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;rear</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;Q[rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;era(T[x].c[</span><span style="color: #000000">0</span><span style="color: #000000">]);&nbsp;era(T[x].c[</span><span style="color: #000000">1</span><span style="color: #000000">]);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;del(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;root0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;sc(P1,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;upd(P1);&nbsp;upd(P0);&nbsp;era(root0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mksame(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</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;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;T[n].sm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;&nbsp;sm_opr(n,&nbsp;x);&nbsp;upd(P1);&nbsp;upd(P0);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;reve(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</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;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;T[n].rev&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">T[n].rev;&nbsp;rev_opr(n);&nbsp;upd(P1);&nbsp;upd(P0);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;get_sum(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(l&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P0,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;P1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Find_Kth(r&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;splay(P1,&nbsp;root);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</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;T[P1].c[</span><span style="color: #000000">0</span><span style="color: #000000">];&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;T[n].sum;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max_sum()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;T[root].midmax;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].sz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].sum&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].lmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].rmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;T[</span><span style="color: #000000">0</span><span style="color: #000000">].midmax&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;front&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">;&nbsp;rear&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MAXN;&nbsp;re1(i,&nbsp;MAXN)&nbsp;Q[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;newnode(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF);&nbsp;newnode(</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF);&nbsp;sc(</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">1</span><span style="color: #000000">);&nbsp;root&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;T[root].p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">sequence.in</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 />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">sequence.out</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">w</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;stdout);<br />&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m,&nbsp;l,&nbsp;r,&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">len,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m);&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;ch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getchar(),&nbsp;str[</span><span style="color: #000000">1000</span><span style="color: #000000">];<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;len)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">a[i]);&nbsp;ins(</span><span style="color: #000000">1</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%s</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;str);<br />&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">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">INSERT</span><span style="color: #000000">"</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">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">len);&nbsp;re(i,&nbsp;len)&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">a[i]);&nbsp;ins(</span><span style="color: #000000">++</span><span style="color: #000000">l);}<br />&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">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">DELETE</span><span style="color: #000000">"</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">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;del(l,&nbsp;r);}<br />&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">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">MAKE-SAME</span><span style="color: #000000">"</span><span style="color: #000000">))&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">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">x);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;mksame(l,&nbsp;r,&nbsp;x);}<br />&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">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">REVERSE</span><span style="color: #000000">"</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">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&nbsp;reve(l,&nbsp;r);}<br />&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">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">GET-SUM</span><span style="color: #000000">"</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">l,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">r);&nbsp;r&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l</span><span style="color: #000000">++</span><span style="color: #000000">;&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;get_sum(l,&nbsp;r));}<br />&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">strcmp(str,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">MAX-SUM</span><span style="color: #000000">"</span><span style="color: #000000">))&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;max_sum());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(stdin);&nbsp;fclose(stdout);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><br />最后把我的这个代码与BYVoid神犇的本题代码进行测试比较，结果（BYVoid神犇的代码见<a title="这里" href="http://www.byvoid.com/blog/noi-2005-sequence/">这里</a>）：<br /><br />BYVoid神犇的：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/BYVoid_Sequence.jpg" width="295" longdesc="" height="166" /><br /><br />本沙茶的：<br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/Mato_No1_Sequence.jpg" width="291" longdesc="" height="166" /><br /><br />【相关论文】<br /><a title="运用伸展树解决数列维护问题" href="http://wenku.baidu.com/view/db0f77661ed9ad51f01df23f.html">运用伸展树解决数列维护问题</a>&nbsp;by JZP<br />【感谢】<br />JZP神犇（提供论文）<br />BYVoid神犇（提供标程）<br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/149121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-06-21 16:06 <a href="http://www.cppblog.com/MatoNo1/archive/2011/06/21/149121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>次小生成树</title><link>http://www.cppblog.com/MatoNo1/archive/2011/05/29/147627.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sun, 29 May 2011 08:03:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/05/29/147627.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/147627.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/05/29/147627.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/147627.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/147627.html</trackback:ping><description><![CDATA[<div>给出一个带边权的无向图G，设其最小生成树为T，求出图G的与T<span style="color: red"><strong>不完全相同</strong></span>的边权和最小的生成树（即G的次小生成树）。一个无向图的两棵生成树不完全相同，当且仅当这两棵树中至少有一条边不同。注意，图G可能不连通，可能有平行边，但一定没有自环（其实对于自环也很好处理：直接舍弃。因为生成树中不可能出现自环）。<br />【具体题目】<a title="URAL1416" href="http://acm.timus.ru/problem.aspx?space=1&amp;num=1416">URAL1416</a>（注意，这一题的边数M的范围没有给出，视为124750）<br />【分析】<br />定义生成树T的一个可行变换(-E1, +E2)：将T中的边E1删除后，再加入边E2（满足边E2原来不在T中但在G中），若得到的仍然是图G的一棵生成树，则该变换为可行变换，该可行变换的<strong style="color: red">代价</strong>为(E2权值 - E1权值)。这样，很容易证明，G的次小生成树就是由G的最小生成树经过一个代价最小的可行变换得到。进一步可以发现，<strong style="color: red">这个代价最小的可行变换中加入的边E2的两端点如果为V1和V2，那么E1一定是原来最小生成树中从V1到V2的路径上的权值最大的边</strong>。<br /><br />这样，对于本题就有两种算法了：（以下的T全部指G的最小生成树）<br />（1）Prim：<br />设立数组F，F[x][y]表示T中从x到y路径上的最大边的权值。F数组可以在用Prim算法求最小生成树的过程中得出。每次将边(i, j)加入后（j是新加入树的边，i=c[j]），枚举树中原有的每个点k（包括i，但不包括j），则F[k][j]=max{F[k][i], (i, j)边权值}，又由于F数组是对称的，可以得到F[j][k]=F[k][j]。然后千万记住将图G中的边(i, j)删除（就是将邻接矩阵中(i, j)边权值改为&#8734;）！因为T中的边是不能被加入的。等T被求出后，所有的F值也求出了，然后，枚举点i、j，若邻接矩阵中边(i, j)权值不是无穷大（这说明i、j间存在不在T中的边），则求出{(i, j)边权值 - F[i][j]}的值，即为加入边(i, j)的代价，求最小的总代价即可。<br />另外注意三种特殊情况：【1】图G不连通，此时最小生成树和次小生成树均不存在。判定方法：在扩展T的过程中找不到新的可以加入的边；【2】图G本身就是一棵树，此时最小生成树存在（就是G本身）但次小生成树不存在。判定方法：在成功求出T后，发现邻接矩阵中的值全部是无穷大；【3】图G存在平行边。这种情况最麻烦，因为这时代价最小的可行变换(-E1, +E2)中，E1和E2可能是平行边！因此，只有建立两个邻接矩阵，分别存储每两点间权值最小的边和权值次小的边的权值，然后，每当一条新边(i, j)加入时，不是将邻接矩阵中边(i, j)权值改为无穷大，而是改为连接点i、j的权值次小的边的权值。<br /><br />代码： 
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re2(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">7000</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;s[MAXN][MAXN],&nbsp;s2[MAXN][MAXN],&nbsp;f[MAXN][MAXN],&nbsp;c[MAXN],&nbsp;v[MAXN],&nbsp;res1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;vst[MAXN];<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">mst.in</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 />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n);<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;re(j,&nbsp;n)&nbsp;s[i][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s2[i][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;m,&nbsp;a,&nbsp;b,&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;res1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">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">len);&nbsp;a</span><span style="color: #000000">--</span><span style="color: #000000">;&nbsp;b</span><span style="color: #000000">--</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(len&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;s[a][b])&nbsp;{s2[a][b]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s2[b][a]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s[a][b];&nbsp;s[a][b]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s[b][a]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;len;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(len&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;s2[a][b])&nbsp;s2[a][b]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s2[b][a]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(stdin);<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;{f[i][i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;vst[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;v[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s[</span><span style="color: #000000">0</span><span style="color: #000000">][i];}&nbsp;vst[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l0,&nbsp;l1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF,&nbsp;x,&nbsp;y,&nbsp;z;<br />&nbsp;&nbsp;&nbsp;&nbsp;re2(i,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;&nbsp;re(j,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[j]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;v[j]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;l0)&nbsp;{l0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;v[j];&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j;&nbsp;y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;c[j];}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l0&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;INF)&nbsp;{res1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vst[x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;res1&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l0;&nbsp;s[x][y]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s[y][x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(s2[x][y]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;INF&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;s2[x][y]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;l0&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;l1)&nbsp;l1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s2[x][y]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;l0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(j,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">vst[j]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;s[x][j]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;v[j])&nbsp;{v[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s[x][j];&nbsp;c[j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;re(j,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(vst[j]&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;j&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;x)&nbsp;f[j][x]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;f[x][j]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;max(f[j][y],&nbsp;l0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;re2(j,&nbsp;i</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;n)&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(s[i][j]&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;INF)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;z&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s[i][j]&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;f[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(z&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;l1)&nbsp;l1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;z;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l1&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;INF)&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;res1&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;l1;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">mst.out</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">w</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;stdout);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Cost:&nbsp;%d\nCost:&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res1&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;:&nbsp;res1,&nbsp;res2&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;:&nbsp;res2);<br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(stdout);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">res2)&nbsp;solve();<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div><span>效率分析：Prim算法求次小生成树</span><span>的时空复杂度均为O(N</span><sup>2</sup><span>)。</span><br /><br /><span>（2）Kruskal：</span><br /><span>Kruskal算法也可以用来求次小生成树。在准备加入一条新边(a, b)（该边加入后不会出现环）时，选择原来a所在连通块（设为S1）与b所在连通块（设为S2）</span><span>中，</span><strong style="color: red">点的个数少的那个</strong>（如果随便选一个，最坏情况下可能每次都碰到点数多的那个，时间复杂度可能增至O(NM)），找到该连通块中的每个点i，并遍历所有与i相关联的边，若发现某条边的另一端点j在未选择的那个连通块中（也就是该边(i, j)跨越了S1和S2）时，就说明最终在T中"删除边(a, b)并加入该边"一定是一个可行变换，且由于加边是按照权值递增顺序的，(a, b)也一定是T中从i到j路径上权值最大的边，故这个可行变换可能成为代价最小的可行变换，计算其代价为[(i, j)边权值 - (a, b)边权值]，取最小代价即可。注意，在遍历时需要排除一条边，就是(a, b)本身（具体实现时由于用DL边表，可以将边(a, b)的编号代入）。另外还有一个难搞的地方：如何快速找出某连通块内的所有点？方法：由于使用并查集，连通块是用树的方式存储的，可以直接建一棵树（准确来说是一个森林），用&#8220;最左子结点+相邻结点&#8221;表示，则找出树根后遍历这棵树就行了，另外注意在合并连通块时也要同时合并树。<br />对于三种特殊情况：【1】图G不连通。判定方法：遍历完所有的边后，实际加入T的边数小于(N-1)；【2】图G本身就是一棵树。判定方法：找不到这样的边(i, j)；【3】图G存在平行边。这个对于Kruskal来说完全可以无视，因为Kruskal中两条边只要编号不同就视为不同的边。<br />其实Kruskal算法求次小生成树还有一个优化：每次找到边(i, j)后，一处理完这条边就把它从图中删掉，因为当S1和S2合并后，(i, j)就永远不可能再是可行变换中的E2了。<br /><br />代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re(i,&nbsp;n)&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&lt;n;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;re3(i,&nbsp;l,&nbsp;r)&nbsp;for&nbsp;(int&nbsp;i=l;&nbsp;i&lt;=r;&nbsp;i++)</span><span style="color: #000000"><br /></span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;MAXN&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">7000</span><span style="color: #000000">,&nbsp;MAXM&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">130000</span><span style="color: #000000">,&nbsp;INF&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">~</span><span style="color: #000000">0U</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;len,&nbsp;pre,&nbsp;next;<br />}&nbsp;ed[MAXM&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;MAXM];<br /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;edge2&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;len,&nbsp;No;<br />}&nbsp;ed2[MAXM];<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;n,&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;m2,&nbsp;u[MAXN],&nbsp;ch[MAXN],&nbsp;nx[MAXN],&nbsp;q[MAXN],&nbsp;res1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INF;<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init_d()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;ed[i].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[i].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[i].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">%</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;m&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;n;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;add_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed[m].len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l;&nbsp;ed[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[a].pre;&nbsp;ed[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed[a].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;ed[ed[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[m].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed[m].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed[m].len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l;&nbsp;ed[m].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[b].pre;&nbsp;ed[m].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed[b].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;ed[ed[m].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m</span><span style="color: #000000">++</span><span style="color: #000000">;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;del_edge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[ed[No].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[No].next;&nbsp;ed[ed[No].next].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[No].pre;<br />&nbsp;&nbsp;&nbsp;&nbsp;ed[ed[No&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">].pre].next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[No&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">].next;&nbsp;ed[ed[No&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">].next].pre&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[No&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">].pre;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">mst.in</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 />&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">n,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">m2);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">m2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(n&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;res1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;init_d();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;b,&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="color: #000000">"</span><span style="color: #000000">%d%d%d</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">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">len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ed2[i].No&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m;&nbsp;add_edge(</span><span style="color: #000000">--</span><span style="color: #000000">a,&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">b,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ed2[i].a&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;a;&nbsp;ed2[i].b&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;b;&nbsp;ed2[i].len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(stdin);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;cmp(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">s1,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">s2)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;((edge2&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)s1)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">len&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;((edge2&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)s2)</span><span style="color: #000000">-&gt;</span><span style="color: #000000">len;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;prepare()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;n)&nbsp;u[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ch[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nx[i]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;qsort(ed2,&nbsp;m2,&nbsp;</span><span style="color: #000000">16</span><span style="color: #000000">,&nbsp;cmp);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;find(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x,&nbsp;r0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;x,&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(u[r]&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;r&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;u[r];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(u[r0]&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;{tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;u[r0];&nbsp;u[r0]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r;&nbsp;r0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;r;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;uni(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r1,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r2,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;No,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l0)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;q[</span><span style="color: #000000">0</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r1;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;j,&nbsp;k,&nbsp;l1,&nbsp;front,&nbsp;rear;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(front</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;front</span><span style="color: #000000">&lt;=</span><span style="color: #000000">rear;&nbsp;front</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ch[q[front]];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(j&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q[</span><span style="color: #000000">++</span><span style="color: #000000">rear]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;nx[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;re3(i,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;rear)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;q[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">ed[j].next;&nbsp;p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;j;&nbsp;p</span><span style="color: #000000">=</span><span style="color: #000000">ed[p].next)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[p].b;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(p&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;No&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;find(k)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;r2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed[p].len&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;l0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(l1&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;res2)&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;l1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;del_edge(p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;u[r2]&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;u[r1];&nbsp;u[r1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r2;&nbsp;nx[r1]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ch[r2];&nbsp;ch[r2]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;r1;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;solve()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;r1,&nbsp;r2,&nbsp;l0,&nbsp;num&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;re(i,&nbsp;m2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;find(ed2[i].a);&nbsp;r2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;find(ed2[i].b);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(r1&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;r2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l0&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ed2[i].len;&nbsp;res1&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;l0;&nbsp;num</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(u[r1]&nbsp;</span><span style="color: #000000">&gt;=</span><span style="color: #000000">&nbsp;u[r2])&nbsp;uni(r1,&nbsp;r2,&nbsp;ed2[i].No,&nbsp;l0);&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;uni(r2,&nbsp;r1,&nbsp;ed2[i].No&nbsp;</span><span style="color: #000000">^</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;l0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(num&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;n&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{res1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(res2&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;INF)&nbsp;res2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;res2&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;res1;<br />}<br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;pri()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;freopen(</span><span style="color: #000000">"</span><span style="color: #000000">mst.out</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">w</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;stdout);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">Cost:&nbsp;%d\nCost:&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;res1&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;:&nbsp;res1,&nbsp;res2&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">INF&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;:&nbsp;res2);<br />&nbsp;&nbsp;&nbsp;&nbsp;fclose(stdout);<br />}<br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">res1&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;res2&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;INF)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prepare();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;pri();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div>效率分析：可以证明，如果每次都选取点少的连通块，Kruskal算法求次小生成树的时间复杂度为O(M*(logN+logM))，空间复杂度为O(M)。<br />总结：显然Prim适用于稠密图，而Kruskal适用于稀疏图。<br /><br />下面是对于一些数据的测试结果（数据说明：第1~9个点和第15个点为稠密图或一般图，第10~14个点为稀疏图）<br /><br />Prim：<br /><img height="194" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/次小生成树_Prim.jpg" width="333" border="0" /><br /><br />Kruskal（加入删边优化）：<br /><img height="195" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/次小生成树_Kruskal1.jpg" width="340" border="0" /><br /><br />Kruskal（未加删边优化）：<br /><img height="195" alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/次小生成树_Kruskal2.jpg" width="340" border="0" /><br /></div><img src ="http://www.cppblog.com/MatoNo1/aggbug/147627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-05-29 16:03 <a href="http://www.cppblog.com/MatoNo1/archive/2011/05/29/147627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>profit是怎样被SAP的多路增广虐爆的……</title><link>http://www.cppblog.com/MatoNo1/archive/2011/03/19/142225.html</link><dc:creator>Mato_No1</dc:creator><author>Mato_No1</author><pubDate>Sat, 19 Mar 2011 09:55:00 GMT</pubDate><guid>http://www.cppblog.com/MatoNo1/archive/2011/03/19/142225.html</guid><wfw:comment>http://www.cppblog.com/MatoNo1/comments/142225.html</wfw:comment><comments>http://www.cppblog.com/MatoNo1/archive/2011/03/19/142225.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/MatoNo1/comments/commentRss/142225.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MatoNo1/services/trackbacks/142225.html</trackback:ping><description><![CDATA[<p>代码1：SAP单路增广（非递归）；</p>
<p>代码2：SAP多路增广（递归）；</p>
<p>代码3：Dinic单路增广（非递归）；</p>
<p>代码4：Dinic多路增广（递归）；</p>
<p>结果：</p>
<p>代码1：<br><img height=146 alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/SAP1.jpg" width=331 border=0></p>
代码2： <br><img height=147 alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/SAP2.jpg" width=336 border=0><br>代码3：<br><img height=145 alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/Dinic1.jpg" width=337 border=0><br>&nbsp;代码4：<br><img height=147 alt="" src="http://www.cppblog.com/images/cppblog_com/matono1/测评结果/Dinic2.jpg" width=337 border=0><br>结果：<br>SAP加了多路增广后，直接秒掉后2个点；<br>Dinic加了多路增广后效率差不多，还更低了一点&#8230;&#8230;<br><br>（另外发现，SAP的多路增广不支持当前弧优化&#8230;&#8230;这点和zkw费用流有点像囧&#8230;&#8230;不过效率影响不大&#8230;&#8230;）<br>
<img src ="http://www.cppblog.com/MatoNo1/aggbug/142225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MatoNo1/" target="_blank">Mato_No1</a> 2011-03-19 17:55 <a href="http://www.cppblog.com/MatoNo1/archive/2011/03/19/142225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>