﻿<?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++博客-acronix-随笔分类-hzshuai解题中算法总结</title><link>http://www.cppblog.com/acronix/category/14579.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 17 Nov 2010 12:58:40 GMT</lastBuildDate><pubDate>Wed, 17 Nov 2010 12:58:40 GMT</pubDate><ttl>60</ttl><item><title>poj3301（三分）</title><link>http://www.cppblog.com/acronix/archive/2010/11/13/133545.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Sat, 13 Nov 2010 13:35:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/11/13/133545.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/133545.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/11/13/133545.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/133545.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/133545.html</trackback:ping><description><![CDATA[<br>来源与分析：<a href="http://chenjianneng3.blog.163.com/blog/static/128345126201033101044920/">http://chenjianneng3.blog.163.com/blog/static/128345126201033101044920/</a><br><br><span style="COLOR: red"><strong>因为是求极值，所以要注意所求的数据范围，特别是最大，最小可能值。<br><br></strong></span>2010 成都赛区的 <span style="FONT-SIZE: 14pt">Error Curves 就是典型的三分：<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; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><strong><img id=Code_Closed_Image_214910 onclick="this.style.display='none'; Code_Closed_Text_214910.style.display='none'; Code_Open_Image_214910.style.display='inline'; Code_Open_Text_214910.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_214910 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_214910.style.display='none'; Code_Closed_Image_214910.style.display='inline'; Code_Closed_Text_214910.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_214910 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span></strong><span id=Code_Open_Text_214910 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><strong><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include&nbsp;</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span></strong><strong><span style="COLOR: #000000">&nbsp;std;<br><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">10010</span></strong><strong><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;eps&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;1e</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">8</span></strong><strong><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;a[maxn],b[maxn],c[maxn];<br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;n;<br><br></span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;cal(</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;x)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1e100,tmp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">注意s的要尽量小</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;a[i]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">x</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">x&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;b[i]</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">x&nbsp;</span><span style="COLOR: #000000">+</span></strong><strong><span style="COLOR: #000000">&nbsp;c[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;max(tmp,s);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span></strong><strong><span style="COLOR: #000000">&nbsp;s;<br>}<br><br></span><span style="COLOR: #0000ff">void</span></strong><strong><span style="COLOR: #000000">&nbsp;solve()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;left&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.0</span><span style="COLOR: #000000">,&nbsp;right&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1000.0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;mid,&nbsp;midmid;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;mid_v,&nbsp;midmid_v;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(left&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;eps&nbsp;</span><span style="COLOR: #000000">&lt;</span></strong><strong><span style="COLOR: #000000">&nbsp;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(left&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;right)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;midmid&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(mid&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;right)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid_v&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;cal(mid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;midmid_v&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;cal(midmid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(mid_v&nbsp;</span><span style="COLOR: #000000">&lt;</span></strong><strong><span style="COLOR: #000000">&nbsp;midmid_v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;midmid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;left&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;mid;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.4lf\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,cal((left</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">right)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span></strong><strong><span style="COLOR: #000000">));<br>}<br><br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;t,i,j;<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">,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">t);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(t</span><span style="COLOR: #000000">--</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%lf&nbsp;%lf&nbsp;%lf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a[i],</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b[i],</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">c[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><span style="COLOR: #000000"><strong>;<br>}<br></strong></span></span></div>
<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; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><strong><img id=Code_Closed_Image_213222 onclick="this.style.display='none'; Code_Closed_Text_213222.style.display='none'; Code_Open_Image_213222.style.display='inline'; Code_Open_Text_213222.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_213222 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_213222.style.display='none'; Code_Closed_Image_213222.style.display='inline'; Code_Closed_Text_213222.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_213222 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span></strong><span id=Code_Open_Text_213222 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><strong><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include&nbsp;</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><br></span><strong><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span></strong><strong><span style="COLOR: #000000">&nbsp;std;<br><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">10086</span></strong><strong><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;a[MAXN],&nbsp;b[MAXN],&nbsp;c[MAXN];<br><br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;main()&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;re,&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;l,&nbsp;r,&nbsp;m1,&nbsp;m2,&nbsp;y1,&nbsp;y2;<br><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></strong><strong><span style="COLOR: #000000">re);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ri&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;ri&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;re;&nbsp;</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">ri)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">n);<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;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;n;&nbsp;</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">i)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%lf%lf%lf</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;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">b[i],&nbsp;</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">c[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1000</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(r&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;l&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;1e</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">8</span></strong><strong><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m1&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;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;r)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m2&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">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;y2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">1e100;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;n;&nbsp;</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">i)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;max(y1,&nbsp;(a[i]&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m1&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;b[i])&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m1&nbsp;</span><span style="COLOR: #000000">+</span></strong><strong><span style="COLOR: #000000">&nbsp;c[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;max(y2,&nbsp;(a[i]&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m2&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;b[i])&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m2&nbsp;</span><span style="COLOR: #000000">+</span></strong><strong><span style="COLOR: #000000">&nbsp;c[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(y1&nbsp;</span><span style="COLOR: #000000">&lt;</span></strong><strong><span style="COLOR: #000000">&nbsp;y2)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;m2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">else</span></strong><strong><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;m1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l&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">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">1e100;<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;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;n;&nbsp;</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">i)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;max(r,&nbsp;(a[i]&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;b[i])&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;l&nbsp;</span><span style="COLOR: #000000">+</span></strong><strong><span style="COLOR: #000000">&nbsp;c[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.4lf\n</span><span style="COLOR: #000000">"</span></strong><strong><span style="COLOR: #000000">,&nbsp;r);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><span style="COLOR: #000000"><strong>;<br>}<br><br></strong></span></span></div>
<br></span><br><span style="COLOR: #808000"><strong style="FONT-SIZE: 18pt">三分法小结：只要解在一点范围内满足凸函数性质就行，通俗点说就是两边夹，从两边不断逼近。<br></strong></span><br><strong style="COLOR: red">模版化</strong>：<br>
<div><strong><span style="COLOR: #0000ff">double&nbsp;Cal</span>(Type&nbsp;a)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;根据题目的意思计算&nbsp;*/<br>}<br><br><span style="COLOR: #0000ff">void&nbsp;Solve</span>(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;Left,&nbsp;Right;<br>&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;mid,&nbsp;midmid;<br>&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;mid_value,&nbsp;midmid_value;<br>&nbsp;&nbsp;&nbsp;&nbsp;Left&nbsp;=&nbsp;MIN;&nbsp;Right&nbsp;=&nbsp;MAX;<br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(Left&nbsp;+&nbsp;EPS&nbsp;&lt;&nbsp;Right)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000ff">mid&nbsp;=&nbsp;(Left&nbsp;+&nbsp;Right)&nbsp;/&nbsp;2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;midmid&nbsp;=&nbsp;(mid&nbsp;+&nbsp;Right)&nbsp;/&nbsp;2;<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mid_value&nbsp;=&nbsp;Cal(mid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;midmid_value&nbsp;=&nbsp;Cal(midmid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;假设求解最大极值.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mid_value&nbsp;&gt;=&nbsp;midmid_value)&nbsp;Right&nbsp;=&nbsp;midmid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Left&nbsp;=&nbsp;mid;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</strong></div>
<br><br><span style="COLOR: #339966"><strong>poj3301cpp代码：<br></strong></span>
<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; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><strong><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include&nbsp;</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cmath</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include&nbsp;</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span></strong><strong><span style="COLOR: #000000">&nbsp;std;<br><br></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;PI&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;acos(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1.0</span></strong><strong><span style="COLOR: #000000">);<br></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;eps&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;1e</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">8</span></strong><strong><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;maxn&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1000</span></strong><strong><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;n;<br></span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;x[</span><span style="COLOR: #000000">35</span><span style="COLOR: #000000">],y[</span><span style="COLOR: #000000">35</span></strong><strong><span style="COLOR: #000000">];<br><br></span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;cal(</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;a)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;&nbsp;bx&nbsp;,by&nbsp;,sx,sy;<br>&nbsp;&nbsp;&nbsp;&nbsp;bx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;by&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">maxn&nbsp;,sx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sy&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;maxn;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;tx,ty;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #339966">//tx，ty为坐标变换后的坐标，具体怎么推得忘了？？？？<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;x[i]&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;cos(a)&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;y[i]&nbsp;</span><span style="COLOR: #000000">*</span></strong><strong><span style="COLOR: #000000">&nbsp;sin(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ty&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;y[i]&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;cos(a)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;x[i]&nbsp;</span><span style="COLOR: #000000">*</span></strong><strong><span style="COLOR: #000000">&nbsp;sin(a);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bx&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;max(tx,bx);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sx&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;min(tx,sx);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;max(ty,by);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sy&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;min(ty,sy);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;max(bx&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;sx&nbsp;,&nbsp;by&nbsp;</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">&nbsp;sy);<br>}<br><br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;t,i,j;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;lf,rt;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;m1,m2;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span></strong><strong><span style="COLOR: #000000">&nbsp;m1_v,m2_v;<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">,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">t);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(t</span><span style="COLOR: #000000">--</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">n);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%lf&nbsp;%lf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">x[i],</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">y[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.0</span><span style="COLOR: #000000">;&nbsp;rt&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;PI</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(lf&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;eps&nbsp;</span><span style="COLOR: #000000">&lt;</span></strong><strong><span style="COLOR: #000000">&nbsp;rt)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(lf&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;rt)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(m1&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;rt)&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m1_v&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;cal(m1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m2_v&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;cal(m2);<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;(m1_v&nbsp;</span><span style="COLOR: #000000">&lt;=</span></strong><strong><span style="COLOR: #000000">&nbsp;m2_v)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rt&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;m2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;lf&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;m1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;len&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;cal(lf);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.2lf\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,len</span><span style="COLOR: #000000">*</span></strong><strong><span style="COLOR: #000000">len);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><span style="COLOR: #000000"><strong>;<br>}<br></strong></span></div>
<br>
<img src ="http://www.cppblog.com/acronix/aggbug/133545.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-11-13 21:35 <a href="http://www.cppblog.com/acronix/archive/2010/11/13/133545.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pojMatrix 树状数组必做题目</title><link>http://www.cppblog.com/acronix/archive/2010/10/29/131744.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Fri, 29 Oct 2010 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/10/29/131744.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/131744.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/10/29/131744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/131744.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/131744.html</trackback:ping><description><![CDATA[<br>题意：自己看吧。<br><br>分析：终于通过这道题弄懂了树状数组。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先这里我不具体解释 int Lowbit（） { i + （- i ) }&nbsp;&nbsp;来源，我只想<strong><u style="COLOR: red">强调的是数组C【i】保存的是C[i - 2^k +1]&nbsp;到C[i] 区间的状态</u></strong>，k 值是 i 二进制表示中末尾0的个数。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong> 我的理解就是树状数组有两种操作down ，up，都是对区间状态的操作，或者点状态的操作，<span style="COLOR: red">注意一点的就是只是状态（包括简单的和，个数的<br><br>统计，本题翻转次数的统计）的查询与修改。</span>树状数组的结构就是多叉树形结构，<span style="COLOR: red">up（即 i + Lowbit(i)）是逐级向上处理父区间(注意我说的是父区间)，<br><br></span><span style="COLOR: red">down （即：i - Lowbit（i））要注意的是 down 不是逐级向下找子区间并进行操作，而是找左边相邻的兄弟区间</span>（我不知道这样描述准不准确，<br><br>你可以看那张经典的树状数组的结构图再自己算算就很明了了）。正因为这样，树状数组能方便的查询父区间（UP操作），而不能方便的访问子区间，<br><br>只能方便访问左边相邻的兄弟区间（down操作），我觉得这就是它相对于线段树的不足之处，不过还是很强大的了。<br></strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="COLOR: #0000ff"><strong>所以，当遇到具体的问题时，只要记住只是区间状态（和，个数，翻转次数。。。。）的访问，具体的操作是用down还是up就很好理解了。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于本题，change时是对区间段的翻转次数进行修改所以是down（依次向左对兄弟区间进行修改），当Query时，其实就是统计点覆盖点（x，y）各区间的总翻转次数所以是向上（up）查询父区间的过程，你可以自己模拟一下就很明了。<br></strong></span><br><br><br><img style="WIDTH: 894px; HEIGHT: 572px" border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/acronix/55a628d10b98f02b9a50276e.jpg" width=894 height=572><br><br>实现的CPP代码如下：<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-FAMILY: courier new; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><strong><span style="COLOR: #000000">#include</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstring</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span></strong><strong><span style="COLOR: #000000">&nbsp;std;<br><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;N&nbsp;1005</span></strong><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"><strong>int</strong></span><strong><span style="COLOR: #000000">&nbsp;mat[N][N];<br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;n;<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;lowbit(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;key){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;key</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">key);<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;getsum(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;y){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ans&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">x;&nbsp;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">n;&nbsp;i</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">lowbit(i))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">y;&nbsp;j</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">n;&nbsp;j</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">lowbit(j))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(ans</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">mat[i][j])</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">2</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span></strong><strong><span style="COLOR: #000000">&nbsp;ans;<br>}<br><br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;change(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;y){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">x;&nbsp;i</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">-=</span></strong><strong><span style="COLOR: #000000">lowbit(i))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">y;&nbsp;j</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;j</span><span style="COLOR: #000000">-=</span></strong><strong><span style="COLOR: #000000">lowbit(j))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mat[i][j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(mat[i][j]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">2</span></strong><strong><span style="COLOR: #000000">;<br>}<br><br><br><br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;main(){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;t;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;si[</span><span style="COLOR: #000000">10</span></strong><strong><span style="COLOR: #000000">];<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">,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">t);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(t</span><span style="COLOR: #000000">--</span></strong><strong><span style="COLOR: #000000">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;m;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">m);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(mat,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(mat));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&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></strong><strong><span style="COLOR: #000000">,si);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(si[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">'</span></strong><strong><span style="COLOR: #000000">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x1,y1,x2,y2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">x1,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">y1,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">x2,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">y2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change(x2,y2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change(x1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">,y2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change(x2,y1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;change(x1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,y1</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="COLOR: #0000ff">else</span></strong><strong><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;x1,y1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">x1,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">y1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span></strong><strong><span style="COLOR: #000000">,getsum(x1,y1));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span></strong><strong><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;</span><span style="COLOR: #000000">0</span></strong><span style="COLOR: #000000"><strong>;<br>}</strong></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>
<img src ="http://www.cppblog.com/acronix/aggbug/131744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-10-29 14:58 <a href="http://www.cppblog.com/acronix/archive/2010/10/29/131744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>http://hi.baidu.com/saintlleo/blog/item/8420a720cfd66f0c4c088d16.html</title><link>http://www.cppblog.com/acronix/archive/2010/10/23/130999.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Sat, 23 Oct 2010 13:06:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/10/23/130999.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/130999.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/10/23/130999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/130999.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/130999.html</trackback:ping><description><![CDATA[
<div>博弈的先攒着吧，不太好理解，先把数据结构搞好在来A你。</div><div>&nbsp;同时记上codeforces 36#D题</div>&nbsp;<a href="http://hi.baidu.com/saintlleo/blog/item/8420a720cfd66f0c4c088d16.html">http://hi.baidu.com/saintlleo/blog/item/8420a720cfd66f0c4c088d16.html</a><img src ="http://www.cppblog.com/acronix/aggbug/130999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-10-23 21:06 <a href="http://www.cppblog.com/acronix/archive/2010/10/23/130999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj pku字符串题目推荐及解题报告</title><link>http://www.cppblog.com/acronix/archive/2010/10/01/128225.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Fri, 01 Oct 2010 13:45:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/10/01/128225.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/128225.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/10/01/128225.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/128225.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/128225.html</trackback:ping><description><![CDATA[<div class="tit" style="font-family: Georgia; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 14px; line-height: 20px !important; height: 43px; background-image: url(http://imgsrc.baidu.com/css/pic/item/9b77e6de4cd39354ccbf1ab8.jpg); background-attachment: initial; background-origin: initial; background-clip: initial; background-color: initial; text-indent: 40px; font-weight: bold; overflow-x: hidden; overflow-y: hidden; color: rgb(102, 102, 102); background-position: 0% 0%; background-repeat: no-repeat no-repeat; ">poj pku字符串题目推荐及解题报告</div><div class="date" style="font-family: Georgia; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 11px; line-height: 20px !important; margin-top: -20px; margin-right: 0px; margin-bottom: 8px; margin-left: 0px; text-indent: 35px; color: rgb(153, 153, 153); text-align: right; "><br></div><table style="line-height: 20px !important; table-layout: fixed; color: rgb(102, 102, 102); font-family: Arial; font-size: 12px; width: 660px; "><tbody style="line-height: 20px !important; "><tr style="line-height: 20px !important; "><td style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 20px !important; "><div id="blog_text" class="cnt" style="font-family: Georgia; word-wrap: break-word; word-break: normal; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 20px; color: rgb(85, 85, 85); overflow-x: hidden; overflow-y: hidden; position: static; ">POJ 1002 - 487-3279(基础)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1002" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=1002</a></span><br style="line-height: normal; ">题意：略<br style="line-height: normal; ">解法：二叉查找数，map，快排...<br style="line-height: normal; "><br style="line-height: normal; ">POJ 1200 - Crazy Search(基础)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1200" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=1200</a></span><br style="line-height: normal; ">题意：找出不相同的子串数量，字母表大小和子串长度会给定，这题很推荐hash入门者一做<br style="line-height: normal; ">解法：hash(建议karp-rabin)<br style="line-height: normal; "><br style="line-height: normal; ">POJ 1204 - Word Puzzles(基础)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1204" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=1204</a></span><br style="line-height: normal; ">题意：基本多串匹配<br style="line-height: normal; ">解法：多串匹配自动机（单串去弄肯定会超时）<br style="line-height: normal; "><br style="line-height: normal; ">POJ 1229 - Wild Domains(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1229" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=1229</a></span><br style="line-height: normal; ">题意：模糊匹配<br style="line-height: normal; ">解法：dp<br style="line-height: normal; "><br style="line-height: normal; ">POJ 1625 - Censored!(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1625" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=1625</a></span><br style="line-height: normal; ">题意：求长度为n不包括给定模式串的字符串数量。（题意同2778，但不能按2778的方法，建议先做此题，再做2778）<br style="line-height: normal; ">解法：Aho-Corasick自动机 + dp<br style="line-height: normal; "><span style="line-height: normal; ">相关：<a class="smarterwiki-linkify" href="http://hi.baidu.com/zfy0701/blog/item/c62f41afca8180ca7cd92a19.html" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://hi.baidu.com/zfy0701/blog/item/c62f41afca8180ca7cd92a19.html</a></span><br style="line-height: normal; "><br style="line-height: normal; ">POJ 1743 - Musical Theme(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1743" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=1743</a></span><br style="line-height: normal; ">题意：找一个串中最长不重叠子串<br style="line-height: normal; ">解法：后缀数组+二分枚举答案，后缀数组+栈扫描，RK+二分枚举答案<br style="line-height: normal; "><span style="line-height: normal; ">相关：<a class="smarterwiki-linkify" href="http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html</a></span><br style="line-height: normal; ">POJ 1816 - Wild Words(中等，绝对的Trie应用好题，同时又是搜索好题)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1816" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=1816</a></span><br style="line-height: normal; ">题意：扩展多串模式匹配(含?, *)<br style="line-height: normal; ">解法：Trie + dfs，有兴趣也可用基于位并行的自动机(可参考柔性字符串匹配，扩展匹配章节)<br style="line-height: normal; "><br style="line-height: normal; ">POJ 2185 - Milking Grid(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2185" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=2185</a></span><br style="line-height: normal; ">题意：最小矩型的覆盖<br style="line-height: normal; ">解法：KMP (不多的KMP好题)<br style="line-height: normal; "><span style="line-height: normal; ">相关：<a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/showmessage?message_id=33571" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/showmessage?message_id=33571</a></span><br style="line-height: normal; "><br style="line-height: normal; ">POJ 2513 - Colored Sticks(基础)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2513" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=2513</a></span><br style="line-height: normal; ">题意：转化成欧拉回路<br style="line-height: normal; ">解法：并查集+hash，并查集+Trie<br style="line-height: normal; "><br style="line-height: normal; ">POJ 2774 - Long Long Message(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2774" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=2774</a></span><br style="line-height: normal; ">题意：找两个串的公共最长子串<br style="line-height: normal; ">解法：后缀数组，Oracle Factor自动机，后缀自动机<br style="line-height: normal; "><span style="line-height: normal; ">相关：<a class="smarterwiki-linkify" href="http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html</a></span><br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://hi.baidu.com/zfy0701/blog/item/d9fedbd14581113d9b5027ab.html" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://hi.baidu.com/zfy0701/blog/item/d9fedbd14581113d9b5027ab.html</a></span><br style="line-height: normal; "><br style="line-height: normal; ">POJ 2778 - DNA Sequence(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2778" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=2778</a></span><br style="line-height: normal; ">题意：求长度为n不包括给定模式串的字符串数量。<br style="line-height: normal; ">解法：Aho-Corasick自动机(前缀树) + 矩阵快速乘法<br style="line-height: normal; "><span style="line-height: normal; ">相关：<a class="smarterwiki-linkify" href="http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html</a></span><br style="line-height: normal; ">类似于1625，建议先做1625<br style="line-height: normal; "><br style="line-height: normal; ">POJ 1699 - Best Sequence(基础)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1699" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=1699</a></span><br style="line-height: normal; ">题意：转换为TSP问题（注意子串的包含关系！）<br style="line-height: normal; ">解法：回溯，状态dp<br style="line-height: normal; "><br style="line-height: normal; ">POJ 3376 - Finding Palindromes(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3376" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3376</a></span><br style="line-height: normal; ">题意：找回文串组合<br style="line-height: normal; ">解法：找出规律，然后Trie + kmp推广形式<br style="line-height: normal; "><br style="line-height: normal; ">POJ 3415 - Common Substrings(较难)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3415" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3415</a></span><br style="line-height: normal; ">题意：统计两个串中长度&gt;=k的公共子串的数量<br style="line-height: normal; ">解法：后缀数组+栈扫描，后缀自动机<br style="line-height: normal; "><span style="line-height: normal; ">相关：<a class="smarterwiki-linkify" href="http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://hi.baidu.com/zfy0701/blog/item/f2278a0928991dca3bc763a0.html</a></span><br style="line-height: normal; "><br style="line-height: normal; ">POJ 3080 - Blue Jeans(如果用暴力，就很简单)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3080" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3080</a></span><br style="line-height: normal; ">题意：求n个串的最长公共子串<br style="line-height: normal; ">解法：后缀数组+栈扫描，后缀数组+二分枚举，暴力<br style="line-height: normal; "><span style="line-height: normal; ">相关：<a class="smarterwiki-linkify" href="http://hi.baidu.com/zfy0701/blog/item/57ada7edf5f44ed1b31cb1cc.html" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://hi.baidu.com/zfy0701/blog/item/57ada7edf5f44ed1b31cb1cc.html</a></span><br style="line-height: normal; "><br style="line-height: normal; ">POJ 3208 - Apocalypse Someday(较难)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3208" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3208</a></span><br style="line-height: normal; ">题意：略<br style="line-height: normal; ">解法：有意思的自动机dp<br style="line-height: normal; "><br style="line-height: normal; ">POJ 3261 - Milk Patterns(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3261" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3261</a></span><br style="line-height: normal; ">题意：求一个串中重复出现至少k次的最长子串<br style="line-height: normal; ">解法：后缀数组+栈扫描，hash + 二分<br style="line-height: normal; "><br style="line-height: normal; ">POJ 3294 - Life Forms(较难，强烈推荐)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3294" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3294</a></span><br style="line-height: normal; ">题意：n个串中，为大于n/2个串所共有的所有最长子串<br style="line-height: normal; ">解法：后缀数组+栈扫描，暴力(很容易被卡掉)，后缀数组+线段树(?)<br style="line-height: normal; "><span style="line-height: normal; ">相关：<a class="smarterwiki-linkify" href="http://hi.baidu.com/zfy0701/blog/item/57ada7edf5f44ed1b31cb1cc.html" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://hi.baidu.com/zfy0701/blog/item/57ada7edf5f44ed1b31cb1cc.html</a></span><br style="line-height: normal; "><br style="line-height: normal; ">POJ 3576 - Language Recognition(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3576" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3576</a></span><br style="line-height: normal; ">题意：求一个dfa，它满足两个条件，1、能识别所有词的dfa，2、要求状态数最少。<br style="line-height: normal; ">解法：trie + hash<br style="line-height: normal; "><span style="line-height: normal; ">相关：<a class="smarterwiki-linkify" href="http://hi.baidu.com/zfy0701/blog/item/b8332b5cd90e7b45fbf2c033.html" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://hi.baidu.com/zfy0701/blog/item/b8332b5cd90e7b45fbf2c033.html</a></span><br style="line-height: normal; "><br style="line-height: normal; ">POJ 3581 - Sequence(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3581" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3581</a></span><br style="line-height: normal; ">题意：把原串分三段并反转，求字典序最小的那串<br style="line-height: normal; ">解法：后缀数组<br style="line-height: normal; ">本来觉得很水，但却是我目前做得最失败的一道后缀数组题<br style="line-height: normal; "><br style="line-height: normal; ">POJ 3630 - Phone List(基础，强烈推荐用此题练Trie)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3630" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3630</a></span><br style="line-height: normal; ">题意：给n个串，看是否有一个串是另一个串的前缀<br style="line-height: normal; ">解法：快排，Trie<br style="line-height: normal; "><br style="line-height: normal; ">POJ 3690 - Constellations(基础)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3690" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3690</a></span><br style="line-height: normal; ">题意：二维串匹配<br style="line-height: normal; ">解法：转换为一维，或者用多串匹配<br style="line-height: normal; "><br style="line-height: normal; ">POJ 3691 - DNA repair(中等)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3691" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3691</a></span><br style="line-height: normal; ">题意：修复非法字符串需要替换的最少字符数<br style="line-height: normal; ">解法：动态规划，如果使用AC自动机去做dp的话比较简单且只需要二维，用dp[j]表示第i个字符时，第j种状态(不是非法状态)所需要最小的修改量<br style="line-height: normal; "><br style="line-height: normal; ">POJ 3693 - Maximum repetition substring(难)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3693" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.pku.edu.cn/JudgeOnline/problem?id=3693</a></span><br style="line-height: normal; ">题意：求最循环节最多的子串<br style="line-height: normal; ">解法：我所知道的最好的做法应该是先做s-factorization(也就是lempel-ziv)，然后在分解之后的每一段中枚举周期，周期可以通过推导关系式确定是否合法，然后可确定循环次数，取最大的，中间还用到了对kmp的扩展。具体来说有KK算法，和ML算法两种，其中ML不能遍历所有的 runs。<br style="line-height: normal; "><br style="line-height: normal; ">其他OJ：<br style="line-height: normal; "><br style="line-height: normal; ">SPOJ 2743 - Prefix Tiling<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://www.spoj.pl/problems/PRETILE/" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://www.spoj.pl/problems/PRETILE/</a></span><br style="line-height: normal; ">找规律<br style="line-height: normal; "><br style="line-height: normal; ">空罐 Cans(这个自动机dp还是有意思的)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://cat.nknush.kh.edu.tw/ZeroJudge/ShowProblem?problemid=b179" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://cat.nknush.kh.edu.tw/ZeroJudge/ShowProblem?problemid=b179</a></span><br style="line-height: normal; "><br style="line-height: normal; ">HDOJ 2471 - History of Languages(杭州现场赛)<br style="line-height: normal; "><span style="line-height: normal; "><a class="smarterwiki-linkify" href="http://acm.hdu.edu.cn/showproblem.php?pid=2471" style="color: rgb(68, 95, 136); text-decoration: none; line-height: 20px; font-size: 12px; font-family: Georgia; ">http://acm.hdu.edu.cn/showproblem.php?pid=2471</a></span><br style="line-height: normal; ">自动机的等价性，划分集合的dp</div><div><br></div></td></tr></tbody></table>
<img src ="http://www.cppblog.com/acronix/aggbug/128225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-10-01 21:45 <a href="http://www.cppblog.com/acronix/archive/2010/10/01/128225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求最小公倍数和最大公约数</title><link>http://www.cppblog.com/acronix/archive/2010/10/01/128198.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Fri, 01 Oct 2010 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/10/01/128198.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/128198.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/10/01/128198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/128198.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/128198.html</trackback:ping><description><![CDATA[
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; "><br></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; "><br></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; ">一、最大公倍数</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; "><span style="FONT-SIZE: 12pt "><strong>&nbsp;&nbsp;两数的乘积再除以两数的最大公约数法</strong></span><strong>。</strong></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; ">这个方法虽然比较复杂，但是使用范围很广。<br>因为两个数的乘积等于这两个数的最大公约数和最小公倍数的乘积。<br>例如：4和6的最大公约数是2，最小公倍数是12，那么，4&#215;6=2&#215;12。<br>为了便于口算，我们可以把两个数中的任意一个数先除以它们的最大公约数，<br>然后再和另一个数相乘。例如：18和30的最大公约数是6，<br>要求18和30的最小公倍数时，可以先用18除以6得3，再用3和30相乘得90；<br>或者先用30除以6得5，再用5和18得90。这90就是18和30的最小公倍数。</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; "><br></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; ">二、最大公约数</p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; "><span  style="color: rgb(0, 0, 0); font-family: verdana, sans-serif; "><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">//</span><span style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">辗转相除法<span lang="EN-US" style="line-height: 24px; ">--</span>递归<span lang="EN-US" style="line-height: 24px; "></span></span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">int gcd(int a,int b)</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">{</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;</span>if(b==0)</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>return a;</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;</span>else</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>return gcd(b,a%b);</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">}</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">&nbsp;</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">//</span><span style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">辗转相除法<span lang="EN-US" style="line-height: 24px; ">--</span>纯循环<span lang="EN-US" style="line-height: 24px; "></span></span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">int gcd(int a,int b)</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">{</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;</span>int r;</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;</span>while(b!=0)</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;</span>{</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>r=a%b;</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>a=b;</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>b=r;</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;</span>}</span></p><p class="MsoNormal" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; "><span style="line-height: 24px; ">&nbsp;&nbsp;&nbsp;&nbsp;</span>return a;</span></p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; "><span lang="EN-US" style="line-height: 24px; font-size: 12pt; font-family: 宋体; ">}</span></p></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; "><br></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; list-style-type: none; list-style-position: initial; list-style-image: initial; word-wrap: normal; word-break: normal; line-height: 21px; color: rgb(50, 62, 50); font-family: simsun; font-size: 14px; "><br></p><img src ="http://www.cppblog.com/acronix/aggbug/128198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-10-01 13:52 <a href="http://www.cppblog.com/acronix/archive/2010/10/01/128198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>牛顿迭代求线性方程</title><link>http://www.cppblog.com/acronix/archive/2010/09/17/126923.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Fri, 17 Sep 2010 14:46:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/09/17/126923.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/126923.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/09/17/126923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/126923.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/126923.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.cnblogs.com/MiYu/archive/2010/08/22/MiYu.html牛顿法的一个迭代序列：x(n+1)=x(n)－f(x(n))/f'(x(n))。ax^3+bX^2+cx+d=0根的关系:x1 + x2 + x3 = - b / a;x1 * x2 + x1 * x3 + x2 * x3 = c / a;x1 * x2 * x3 = - d / a;f...&nbsp;&nbsp;<a href='http://www.cppblog.com/acronix/archive/2010/09/17/126923.html'>阅读全文</a><img src ="http://www.cppblog.com/acronix/aggbug/126923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-09-17 22:46 <a href="http://www.cppblog.com/acronix/archive/2010/09/17/126923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java</title><link>http://www.cppblog.com/acronix/archive/2010/09/12/126466.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Sun, 12 Sep 2010 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/09/12/126466.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/126466.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/09/12/126466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/126466.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/126466.html</trackback:ping><description><![CDATA[
<a href="http://apps.hi.baidu.com/share/detail/15834448">http://apps.hi.baidu.com/share/detail/15834448</a><div>kmp&nbsp;<a href="http://tiandiwuyong1989.blog.163.com/blog/static/122572981200973175131929/">http://tiandiwuyong1989.blog.163.com/blog/static/122572981200973175131929/</a></div><div>POJ&nbsp;<a href="http://hi.baidu.com/lewutian/blog/item/734c17181ab715bf4bedbc4b.html">http://hi.baidu.com/lewutian/blog/item/734c17181ab715bf4bedbc4b.html</a></div><img src ="http://www.cppblog.com/acronix/aggbug/126466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-09-12 16:52 <a href="http://www.cppblog.com/acronix/archive/2010/09/12/126466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdu _2114有余数的取模</title><link>http://www.cppblog.com/acronix/archive/2010/09/10/126319.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Fri, 10 Sep 2010 06:42:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/09/10/126319.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/126319.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/09/10/126319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/126319.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/126319.html</trackback:ping><description><![CDATA[<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-FAMILY: courier new; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><br><strong><span style="COLOR: #339966">/*&nbsp;a&nbsp;/&nbsp;b&nbsp;(mod&nbsp;n)&nbsp;=&nbsp;a&nbsp;%&nbsp;(b&nbsp;*&nbsp;n)&nbsp;/&nbsp;b&nbsp;(mod&nbsp;n)*\<br>||&nbsp;有除法的取模！！&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br></span><br>#include&nbsp;&lt;cstdio&gt;<br>const&nbsp;int&nbsp;mod&nbsp;=&nbsp;10000;<br><br>int&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;long&nbsp;n;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(scanf("%I64d",&amp;n)&nbsp;!=&nbsp;EOF)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=&nbsp;n*(n+1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=&nbsp;(n&nbsp;%&nbsp;(2*mod)&nbsp;/&nbsp;2)&nbsp;%&nbsp;mod;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;=&nbsp;n*n&nbsp;%&nbsp;mod;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%04I64d\n",n);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br>}</strong></div>
<img src ="http://www.cppblog.com/acronix/aggbug/126319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-09-10 14:42 <a href="http://www.cppblog.com/acronix/archive/2010/09/10/126319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>八数码实验报告（转）</title><link>http://www.cppblog.com/acronix/archive/2010/09/03/125830.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Fri, 03 Sep 2010 14:15:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/09/03/125830.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/125830.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/09/03/125830.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/125830.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/125830.html</trackback:ping><description><![CDATA[<div class=postText>
<div style="TEXT-ALIGN: center"><span class=Title><font size=3><font style="BACKGROUND-COLOR: #00ffff">八数码</font>实验报告</font></span></div>
<div style="TEXT-ALIGN: center"><span class=Title><br>
<p id=TBPingURL><font size=3>&nbsp;转自</font><a href="http://tb.blog.csdn.net/TrackBack.aspx?PostId=599897.aspx"><font color=#8f0101 size=3>http://tb.blog.csdn.net/TrackBack.aspx?PostId=599897.aspx</font></a></p>
</span><font size=4>写得实在是太好了<br></font></div>
<br><font size=3><span style="COLOR: rgb(0,0,255)">问题简介：</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 所谓<font style="BACKGROUND-COLOR: #00ffff">八数码</font>问题是指这样一种游戏：将分别标有数字1，2，3，&#8230;，8的八块正方形数码牌任意地放在一块3&#215;3的数码盘上。放牌时要求不能重叠。于是，在3&#215;3的数码盘上出现了一个空格。现在要求按照每次只能将与空格相邻的数码牌与空格交换的原则，将任意摆放的数码盘逐步摆成某种特殊的排列。如下图表示了一个具体的<font style="BACKGROUND-COLOR: #00ffff">八数码</font>问题求解。<br><br><span style="COLOR: rgb(0,0,255)">问题分析：</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 首先，<font style="BACKGROUND-COLOR: #00ffff">八数码</font>问题包括一个初始状态(START) 和 目标状态(END)，所谓解<font style="BACKGROUND-COLOR: #00ffff">八数码</font>问题就是在两个状态间寻找一系列可过渡状态（START-&gt;STATE1-&gt;STATE2-&gt;...-&gt;END）。这个状态是否存在就是我们要解决的第一个问题：<br><br><span style="COLOR: rgb(255,0,0)">Q1：每一个状态及每一次操作的表示方法？</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 有许多表示方法，比如一个3*3的<font style="BACKGROUND-COLOR: #00ffff">八数码</font>盘可以压缩成一个int值表示，但不适用于15 puzzle或大于8 的puzzle问题。如果对空间要求很高，应该还可以再压缩。本文采用一个int表示的方法。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 表示方法如下：由于int的表示范围大于1e9，所以我们取一个int的低9位，为了方便寻找空格的位置，int的个位我们用来放空格的位置（1-9）。而前8位，按照行从上到下，列从左到右的顺序依次记录对应位置上的数字。例如：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 可以表示成 2 3 1 5 8 4 6 7 5 ，个位的5表示空格在第5位，前八位数按顺序记录。坐标转换公式为：<br>&nbsp;&nbsp;&nbsp; num（压缩后的int） x y（求x行y列,1记起）1e(n)为 1乘10的n次<br>&nbsp;&nbsp;&nbsp; int temp=(x-1)*3+y<br>&nbsp;&nbsp;&nbsp; if&nbsp; temp &gt; num%10 then return (num / 1e(9-temp+1)) %10<br>&nbsp;&nbsp;&nbsp; else return (num / 1e(9-temp) )%10<br><br>&nbsp;&nbsp;&nbsp; 为了方便本文介绍，取目标状态为：1 2 3 4 5 6 7 8 9 即--&gt;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 操作本文用 u r d l 分别表示 空格的向上 向右 向下 向左 四个操作。比如，在简介中的图包括两步操作 l d ，可能与平时玩这类游戏的习惯不符合，但这是为了和ACM例题相统一。<br><br>&nbsp;&nbsp;&nbsp; 对应地，每种操作引起的状态变化如下：<br>&nbsp;&nbsp;&nbsp; r ：num值++&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;l ：num值--<br>&nbsp;&nbsp;&nbsp; u ：有点复杂 <br>&nbsp;&nbsp;&nbsp; int t0 = 9-num%10 + 1<br>&nbsp;&nbsp;&nbsp; int t1 = num / 1e(t0)<br>&nbsp;&nbsp;&nbsp; int t2 = t1%1000<br>&nbsp;&nbsp;&nbsp; t1= t1- t2 + (t2 % 100) * 10 + t2 / 100<br>&nbsp;&nbsp;&nbsp; t1*= 1e(t0)<br>&nbsp;&nbsp;&nbsp; return (t1 + ( (num % t0) - 3))<br>&nbsp;&nbsp;&nbsp; d ：return前面同u操作， return返回&nbsp; (t1 + ( (num % t0) + 3))<br><br><span style="COLOR: rgb(255,0,0)">Q2：判断是否存在中间状态使START 到达END？</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 用组合数学的方法可以快速地进行判断，例如SOJ 2061题 2360题中都是关于此类的问题。但<font style="BACKGROUND-COLOR: #00ffff">八数码</font>的判断方法比他们简单多了。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 本文用的方法是计算排列的逆序数值，以2 3 1 5 8 4 6 7 5 为例子，5表示的是空格，不计算，那么求23158467 的逆序值为 <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 0 + 0 + 2 (1&lt;2 1&lt;3 ) + 0 + 0 + 1 ( 4&lt;5 ) + 1 ( 6&lt;8 ) + 1 ( 7&lt;8 ) = 5 <br>目标状态1 2 3 4 5 6 7 8 9 的逆序自然就是0。<br><br>两个状态之间是否可达，可以通过计算两者的逆序值，若两者奇偶性相同则可达，不然两个状态不可达。<br><br>简单证明一下：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; l 和 r 操作，不会影响状态的逆序值，因为只会改变个位数（空格的位置）。 <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; u和d操作是使某个位置的数字 右/左 移两位。 由于数字序列的每一次移动会使逆序值奇偶性改变，所以&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 移动两次后奇偶性不变。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 所以 四个操作均不会影响序列的奇偶性。<br><br><span style="COLOR: rgb(255,0,0)">Q3：如何寻找一系列的中间状态及遇到的问题？</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 要寻找这一系列中间状态的方法是搜索，但搜索很容易遇到时间和空间上的问题。以下就是搜索的基本原理：<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 由1 3 7 2 4 6 8 5 2 状态可以衍生三个状态，假如选择了1 2 3 7 4 6 8 5 5 ，则又衍生三个状态，继续按某策略进行选择，一直到衍生出的新状态为目标状态END 为止。<br>容易看出，这样的搜索类似于从树根开始向茎再向叶搜索目标叶子一样的树型状。由于其规模的不断扩大，其叶子也愈加茂密，最终的规模会大到无法控制。这样在空间上会大大加大搜索难度，在时间上也要消耗许多。<br><br>在普通搜索中遇到以下问题：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; a&nbsp; 搜索中易出现循环，即访问某一个状态后又来访问该状态。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; b 搜索路径不佳便无法得到较好的中间状态集（即中间状态集的元素数量过大）。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; c 搜索过程中访问了过多的无用状态，这些状态对最后的结果无帮助。<br><br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 以上三个问题中，a为致命问题，应该它可能导致程序死循环；b和c是非致命的，但若不处理好可能导致性能急剧下降。<br><br><br><span style="COLOR: rgb(255,0,0)">Q4：怎样避免重复访问一个状态？</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 最直接的方法是记录每一个状态访问否，然后再衍生状态时不衍生那些已经访问的状态了。思想是，给每个状态标记一个flag，若该状态flag = true则不衍生，若为false则衍生并修改flag为true。<br>在某些算法描述里，称有两个链表，一个为活链表（待访问），一个为死链表（访问完）。每一次衍生状态时，先判断它是否已在两个链表中，若存在，则不衍生；若不存在，将其放入活链表。对于被衍生的那个状态，放入死链表。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 为了记录每一个状态是否被访问过，我们需要有足够的空间。<font style="BACKGROUND-COLOR: #00ffff">八数码</font>问题一共有9!，这个数字并不是很大，但迎面而来的另一个问题是我们如何快速访问这些状态，如果是单纯用链表的话，那么在规模相当大，查找的状态数目十分多的时候就不能快速找到状态，其复杂度为O(n),为了解决这个问题，本文将采用哈希函数的方法，使复杂度减为O(1)。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 这里的哈希函数是用能对许多全排列问题适用的方法。取n!为基数，状态第n位的逆序值为哈希值第n位数。对于空格，取其（9-位置）再乘以8!。例如，1 3 7 2 4 6 8 5 8 的哈希值等于：<br>0*0! + 0*1! + 0*2! + 2*3! + 1*4! + 1*5! + 0*6! + 3*7! + (9-8)*8! = 55596 &lt;9!<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 具体的原因可以去查查一些数学书，其中1 2 3 4 5 6 7 8 9 的哈希值是0 最小，8 7 6 5 4 3 2 1 0 的哈希值是（9!-1）最大，而其他值都在0 到 （9!-1） 中，且均唯一。<br><br><span style="COLOR: rgb(255,0,0)">Q5：如何使搜索只求得最佳的解？</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 普通的搜索称为DFS（深度优先搜索）。除了DFS，还有BFS，从概念上讲，两者只是在扩展时的方向不同，DFS向深扩张，而BFS向广扩张。在<font style="BACKGROUND-COLOR: #00ffff">八数码</font>问题的解集树中，树的深度就表示了从初始态到目标态的步数，DFS一味向深，所以很容易找出深度较大的解。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BFS可以保证解的深度最少，因为在未将同一深度的状态全部访问完前，BFS不会去访问更深的状态，因此比较适合<font style="BACKGROUND-COLOR: #00ffff">八数码</font>问题，至少能解决求最佳解的难题。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 但是BFS和DFS一样不能解决问题c ，因为每个状态都需要扩张，所以广搜很容易使待搜状态的数目膨胀。最终影响效率。<br><br><br><span style="COLOR: rgb(255,0,0)">Q6：该如何减少因广搜所扩张的与目标状态及解无关的状态？</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 前面所说的都是从START状态向END状态搜索，那么，将END状态与START状态倒一下，其实会有另一条搜索路径（Q8策略三讨论），但简单的交换END与START并不能缩小状态膨胀的规模。我们可以将正向与反向的搜索结合起来，这就是双向广度搜索。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 双向广搜是指同时从START和END两端搜，当某一端所要访问的一个状态是被另一端访问过的时候，即找到解，搜索结束。它的好处是可以避免广搜后期状态的膨胀。<br>采用双向广度搜索可以将空间和时间节省一半！<br><br><br><span style="COLOR: rgb(255,0,0)">Q7：决定一个快的检索策略？</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 双向广搜能大大减少时间和空间，但在有的情况下我们并不需要空间的节省，比如在Q4中已经决定了我们需要使用的空间是9！，所以不需要节省。这样我们可以把重点放在时间的缩短上。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 启发式搜索是在路径搜索问题中很实用的搜索方式，通过设计一个好的启发式函数来计算状态的优先级，优先考虑优先级高的状态，可以提早搜索到达目标态的时间。A*是一种启发式搜索的，他的启发式函数f ' ()=g' () + h' () 能够应用到<font style="BACKGROUND-COLOR: #00ffff">八数码</font>问题中来。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g' () ----- 从起始状态到当前状态的实际代价g*()的估计值，g' () &gt;= g*()<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; h' () ----- 从当前状态到目标状态的实际代价h*()的估计值，h' () &lt;= h*()<br>注意两个限制条件：<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; （1）h' () &lt;= h*()&nbsp; （2）任意状态的f '()值必须大于其父状态的f '()值，即f '()单调递增。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 其中，g' () 是搜索的深度， h' () 则是一个估计函数，用以估计当前态到目标态可能的步数。解<font style="BACKGROUND-COLOR: #00ffff">八数码</font>问题时一般有两种估计函数。比较简单的是difference ( Status a,&nbsp; Status b )， 其返回值是a 和b状态各位置上数字不同的次数。另一种比较经典的是曼哈顿距离&nbsp;&nbsp; manhattan ( Status a, Status b )，其返回的是各个数字从a的位置到b的位置的距离（见例子）。<br><br>例如状态 1 3 7 2 4 6 8 5 2 和状态 1 2 3 4 5 6 7 8 9 的difference 是5（不含空格）。而他的manhattan 距离是：<br>1 (7d一次) + 1 (2u一次) + 2 (4l两次) + 3 (6r两次u一次) + 2 (5u一次l一次) = 9<br>单个数字的manhattan应该小于5，因为对角的距离才4，若大于4则说明计算有误。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 无论是difference还是manhattan，估计为越小越接近END，所以优先级高。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 在计算difference和manhattan时，推荐都将空格忽略，因为在difference中空格可有可无，对整体搜索影响不大。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 本文后面的实现将使用manhattan 不计空格的方法。其实，每移动一步，不计空格，相当于移动一个数字。如果每次移动都是完美的，即把一个数字归位，那么START态到END态的距离就是manhattan。反过来说，manhattan是START到END态的至少走的步数。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 回到f '()=g' ()+ h' ()，其实广度搜索是h' ()=0的一种启发式搜索的特例，而深度搜索是&nbsp;&nbsp; f ' ()=0 的一般搜索。h' ()对于优化搜索速度有很重要的作用。<br><br><span style="COLOR: rgb(255,0,0)">Q8：能否进一步优化检索策略？</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 答案是肯定的。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; A*搜索策略的优劣就是看h' ()的决定好坏。前面列举了两个h' ()的函数，但光有这两个是不够的。经过实验分析，在f '()中，g '()决定的是START态到END态中求得的解距离最优解的距离。 而h' () 能影响搜索的速度。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 所以优化的第一条策略是，放大h' ()，比如，让h '()= 10* manhattan()，那么f '()= g' ()+10*manhattan()，可能提高搜索速度。可惜的是所得的解将不再会是最优的了。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 为什么放大h'()能加快搜索速度，我们可以想象一下，h'()描述的是本状态到END态的估计距离，估计距离越短自然快一点到达END态。而 g' ()描述的是目前的深度，放大h' ()的目的是尽量忽略深度的因素，是一种带策略的深搜，自然速度会比广搜和深搜都快，而因为减少考虑了深度因素，所以离最优解就越来越远了。关于h' ()放大多少，是很有趣的问题，有兴趣可以做些实验试试。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 第二条是更新待检查的状态，由于A*搜索会需要一个待检查的序列。首先，在Q4已经提到用哈希避免重复访问同一状态。而在待检查队列中的状态是未完成扩张的状态，如果出现了状态相同但其g '()比原g '()出色的情况，那么我们更希望的是搜索新状态，而不是原状态。这样，在待检查队列中出现重复状态时，只需更新其g'() 就可以了。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 第三条是注意实现程序的方法，在起初我用sort排序f '()后再找出权值最大的状态，而后发现用make_heap要更快。想一想，由于需要访问的接点较多，待访问队列一大那么自然反复排序对速度会有影响，而堆操作则比排序更好。另一点是，实现更新待检查队列时的搜索也要用比较好的方法实现。我在JAVA的演示程序中用的PriorityQueue，可是结果不是很令人满意。<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 第四条优化策略是使用IDA*的算法，这是A*算法的一种，ID名为Iterative deepening是迭代加深的意思。思想是如下：<br>顺便准备一个记录一次循环最小值的temp=MAX, h' 取 manhattan距离<br>&nbsp;&nbsp; &nbsp;先估算从START态到END态的h'() 记录为MIN，将START放入待访问队列<br>&nbsp;&nbsp; &nbsp;读取队列下一个状态，到队列尾则GOTO⑦<br>&nbsp;&nbsp; &nbsp;若g'() &gt; MIN GOTO ⑥<br>&nbsp;&nbsp; &nbsp;若g'() + h'()&nbsp; &gt; MIN 是否为真，真GOTO ⑥，否 GOTO ⑤<br>&nbsp;&nbsp; &nbsp;扩展该状态，并标记此状态已访问。找到END态的话就结束该算法。GOTO ②<br>&nbsp;&nbsp; &nbsp;temp = min(manhattan , temp),GOTO ③<br>&nbsp;&nbsp; &nbsp;若无扩展过状态，MIN=temp （ID的意思在这里体现）从头开始循环GOTO ②<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 第五条优化策略本身与搜索无关，在做题时也没能帮上忙，不过从理论上讲是有参考价值的。记得Q6中介绍的从END开始搜起吗？如果我们的任务是对多个START 与END进行搜索，那么我们可以在每搜索完一次后记录下路径，这个路径很重要，因为在以后的搜索中如果存在START和END的路径已经被记录过了，那么可以直接调出结果。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 从END搜起，可以方便判断下一次的START是否已经有路径到END了。当前一次搜索完时，其已访问状态是可以直接使用的，若START不在其中，则从待访问的状态链表中按搜索策略找下一个状态，等于接着上一次的搜索结果开始找。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 之所以没能在速度上帮上忙，是因为这个优化策略需要加大g' ()的比重，否则很容易出现深度相当大的情况，由于前一次搜索的策略与下一次的基本无关，导致前一次的路径无法预料，所以就会出现深度过大的情况。解决方法是加大g' ()。<br>策略五类似给程序加一个缓冲区，避免重复计算。如果要做<font style="BACKGROUND-COLOR: #00ffff">八数码</font>的应用，缓冲区会帮上忙的。<br><br><span style="COLOR: rgb(255,0,0)">Q10：怎样记录找到的路径？</span><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 当找到解的时候我们就需要有类似回退的工作来整理一条解路径，由于使用了不是简单的DFS，所以不能借助通过函数调用所是使用的程序栈。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 我们可以手工加一个模拟栈。在Q4中解决了哈希的问题，利用哈希表就能快速访问状态对应的值，在这里，我们把原来的bool值改为char或其他能表示一次操作（至少需要5种状态，除了u r l d 外还要能表示状态已访问）的值就行了。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 在搜索到解时，记录下最后一个访问的状态值，然后从读取该状态对应的操作开始，就像栈操作的退栈一样，不停往回搜，直到找到搜索起点为止。记录好栈退出来的操作值，就是一条路径。<br></font><br><br><font size=3>Eight （ACM试题）：<br>PKU 1077题（易）：</font><a href="http://acm.pku.edu.cn/JudgeOnline/showproblem?problem_id=1077"><strong><font color=#006bad size=3>http://acm.pku.edu.cn/JudgeOnline/showproblem?problem_id=1077 </font></strong></a><br><font size=3>ZJU 1217题（颇难）：</font><a href="http://acm.zju.edu.cn/show_problem.php?pid=1217"><strong><font color=#006bad size=3>http://acm.zju.edu.cn/show_problem.php?pid=1217 </font></strong></a><br><font size=3>UVA 652题： </font><a href="http://acm.uva.es/p/v6/652.html"><strong><font color=#006bad size=3>http://acm.uva.es/p/v6/652.html</font></strong></a><br><font size=3>杭州电子科技大学1043题（难）：</font><a href="http://acm.hziee.edu.cn/showproblem.php?pid=1043"><strong><font color=#006bad size=3>http://acm.hziee.edu.cn/showproblem.php?pid=1043 </font></strong></a><br><font size=3>中国科技大学 112题（非SJ）：</font><a href="http://acm.ustc.edu.cn/makeproblem.php?probID=112"><strong><font color=#006bad size=3>http://acm.ustc.edu.cn/makeproblem.php?probID=112</font></strong></a><br><br><font size=3>相关题目：<br>SOJ 2061题： </font><a href="http://acm.scu.edu.cn/soj/problem.action?id=2061"><strong><font color=#006bad size=3>http://acm.scu.edu.cn/soj/problem.action?id=2061</font></strong></a><br><font size=3>SOJ 1110题： </font><a href="http://acm.scu.edu.cn/soj/problem.action?id=1110"><strong><font color=#006bad size=3>http://acm.scu.edu.cn/soj/problem.action?id=1110</font></strong></a><br><font size=3>SOJ 2360题： </font><a href="http://acm.scu.edu.cn/soj/problem.action?id=2360"><strong><font color=#006bad size=3>http://acm.scu.edu.cn/soj/problem.action?id=2360</font></strong></a></div>
<img src ="http://www.cppblog.com/acronix/aggbug/125830.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-09-03 22:15 <a href="http://www.cppblog.com/acronix/archive/2010/09/03/125830.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>KMP学习记录</title><link>http://www.cppblog.com/acronix/archive/2010/08/23/124473.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Mon, 23 Aug 2010 13:39:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/08/23/124473.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/124473.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/08/23/124473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/124473.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/124473.html</trackback:ping><description><![CDATA[<br>
<p>首先要了解KMP算法中的next[]和nextval[]。</p>
<p>&nbsp;&nbsp; <span style="COLOR: #3366ff">nexttval[]算是next[]的改进算法，不过就是s[k]、s[j]是否相等的区别。</span></p>
<p>我的理解是，假设a是源字符串，b是要进行匹配的字串，next[i]及nextval[]通过b串生成。i指向a串当前进行匹配的字符，j指向b串当前进行匹配的字符。</p>
<p>规定，next[]与nextval[]第一个元素的值为字符串起始元素序号减1。</p>
<p>next[j]是当b[j]失配（即a[i]!=b[j]）时，j往前跳的位置。能保证：b[0]到b[j-1]均与a[i]前j-1个字符（不包括a[i]本身）一一匹配；且此时next[j]能保证b[0]到b[next[j]-1]均与a[i]前next[j]-1个字符（不包括a[i]本身）一一匹配的，小于j的最大值。</p>
<p>nextval[i]与next[i]一样，只不过，b[j]有可能等于b[next[j]]，所以失配后，用next[]可能要跳几次才能找到a[i]与b[j]不同的值继续匹配；而b[j]不会等于b[nextval[j]]，所以失配后只需跳一次即可。</p>
<p>比如：</p>
<div align=center>
<table cellSpacing=0 cellPadding=2 width=400 align=center border=1>
    <tbody>
        <tr>
            <td vAlign=top width=70>&nbsp;</td>
            <td vAlign=top width=45>a</td>
            <td vAlign=top width=57>a</td>
            <td vAlign=top width=57>a</td>
            <td vAlign=top width=57>a</td>
            <td vAlign=top width=56>b</td>
            <td vAlign=top width=56>b</td>
        </tr>
        <tr>
            <td vAlign=top width=70>j</td>
            <td vAlign=top width=45>0</td>
            <td vAlign=top width=57>1</td>
            <td vAlign=top width=57>2</td>
            <td vAlign=top width=57>3</td>
            <td vAlign=top width=56>4</td>
            <td vAlign=top width=56>5</td>
        </tr>
        <tr>
            <td vAlign=top width=70>next[]</td>
            <td vAlign=top width=45>-1</td>
            <td vAlign=top width=57>0</td>
            <td vAlign=top width=57>1</td>
            <td vAlign=top width=57>2</td>
            <td vAlign=top width=56>3</td>
            <td vAlign=top width=56>0</td>
        </tr>
        <tr>
            <td vAlign=top width=70>nextval[]</td>
            <td vAlign=top width=45>-1</td>
            <td vAlign=top width=57>-1</td>
            <td vAlign=top width=57>-1</td>
            <td vAlign=top width=57>-1</td>
            <td vAlign=top width=56>3</td>
            <td vAlign=top width=56>0</td>
        </tr>
    </tbody>
</table>
</div>
<div align=center>&nbsp;</div>
<div align=center>
<table cellSpacing=0 cellPadding=2 width=550 align=center border=1>
    <tbody>
        <tr>
            <td vAlign=top width=80>&nbsp;</td>
            <td vAlign=top width=29>a</td>
            <td vAlign=top width=27>b</td>
            <td vAlign=top width=41>c</td>
            <td vAlign=top width=41>a</td>
            <td vAlign=top width=42>b</td>
            <td vAlign=top width=42>d</td>
            <td vAlign=top width=41>a</td>
            <td vAlign=top width=41>b</td>
            <td vAlign=top width=41>c</td>
            <td vAlign=top width=41>a</td>
            <td vAlign=top width=41>b</td>
            <td vAlign=top width=41>d</td>
        </tr>
        <tr>
            <td vAlign=top width=80>j</td>
            <td vAlign=top width=29>0</td>
            <td vAlign=top width=27>1</td>
            <td vAlign=top width=41>2</td>
            <td vAlign=top width=41>3</td>
            <td vAlign=top width=42>4</td>
            <td vAlign=top width=42>5</td>
            <td vAlign=top width=41>6</td>
            <td vAlign=top width=41>7</td>
            <td vAlign=top width=41>8</td>
            <td vAlign=top width=41>9</td>
            <td vAlign=top width=41>10</td>
            <td vAlign=top width=41>11</td>
        </tr>
        <tr>
            <td vAlign=top width=80>next[]</td>
            <td vAlign=top width=29>-1</td>
            <td vAlign=top width=27>0</td>
            <td vAlign=top width=41>0</td>
            <td vAlign=top width=41>0</td>
            <td vAlign=top width=42>1</td>
            <td vAlign=top width=42>2</td>
            <td vAlign=top width=41>0</td>
            <td vAlign=top width=41>1</td>
            <td vAlign=top width=41>2</td>
            <td vAlign=top width=41>3</td>
            <td vAlign=top width=41>4</td>
            <td vAlign=top width=41>5</td>
        </tr>
        <tr>
            <td vAlign=top width=80>nextval[]</td>
            <td vAlign=top width=29>-1</td>
            <td vAlign=top width=27>0</td>
            <td vAlign=top width=41>0</td>
            <td vAlign=top width=41>-1</td>
            <td vAlign=top width=42>0</td>
            <td vAlign=top width=42>2</td>
            <td vAlign=top width=41>-1</td>
            <td vAlign=top width=41>0</td>
            <td vAlign=top width=41>0</td>
            <td vAlign=top width=41>-1</td>
            <td vAlign=top width=41>0</td>
            <td vAlign=top width=41>2</td>
        </tr>
    </tbody>
</table>
</div>
<p>应该讲得差不多了吧。下面是KMP算法的模板：</p>
<p>生成next[]的模板：（s为传入的字符串，l为s的长度，next[]为要生成的next数组；如果是string类型，则将&#8220;char s[]&#8221;改为&#8220;string s&#8221;即可）<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><strong><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;getNext(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;s[],</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len,</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;next[])<br>{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,k;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;k</span><span style="COLOR: #000000">=-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;<br>　　next[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br>　　</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(i&nbsp;</span><span style="COLOR: #000000">&lt;</span></strong><strong><span style="COLOR: #000000">&nbsp;len)&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">if&nbsp; </span><span style="COLOR: #000000">(k</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;s[i]</span><span style="COLOR: #000000">==</span></strong><strong><span style="COLOR: #000000">s[k])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; next[i]</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">k;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;&nbsp;k</span><span style="COLOR: #000000">=</span></strong><span style="COLOR: #000000"><strong>next[k];&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></strong></span></div>
<p><br></p>
<p>生成nextval[]的模板：（s为传入的字符串，l为s的长度，nextval[]为要生成的nextval数组；如果是string类型，则将&#8220;char s[]&#8221;改为&#8220;string s&#8221;即可）</p>
<pre>
<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; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><strong><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;getNextVal(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;s[],</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len,</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;nextval[])<br>{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,k;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;k</span><span style="COLOR: #000000">=-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;<br>　　nextval[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(i&nbsp;</span><span style="COLOR: #000000">&lt;</span></strong><strong><span style="COLOR: #000000">&nbsp;len)&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(k&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;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;s[i]&nbsp;</span><span style="COLOR: #000000">==</span></strong><strong><span style="COLOR: #000000">&nbsp;s[k])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;k</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(s[i]&nbsp;</span><span style="COLOR: #000000">!=</span></strong><strong><span style="COLOR: #000000">&nbsp;s[k])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nextval[i]&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;k;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;nextval[i]&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;nextval[k];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span></strong><strong><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k</span><span style="COLOR: #000000">=</span></strong><span style="COLOR: #000000"><strong>nextval[k];&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></strong></span></div>
</pre>
<pre>      具体使用的实例：</pre>
<pre><span style="FONT-SIZE: 14pt; COLOR: #3366ff"><strong>1、POJ 2406 Power Strings</strong></span></pre>
<pre>题意：给一个字符串S长度不超过10^6，求最大的n使得S由n个相同的字符串a连接而成，如："ababab"则由n=3个"ab"连接而成，</pre>
<pre>"aaaa"由n=4个"a"连接而成，"abcd"则由n=1个"abcd"连接而成。</pre>
<pre><br><br>定理：假设S的长度为len，则S存在循环子串，当且仅当，len可以被len - next[len]整除，最短循环子串为S[len - next[len]]<br><br>例子证明：<br>设S=q<sub>1</sub>q<sub>2</sub>q<sub>3</sub>q<sub>4</sub>q<sub>5</sub>q<sub>6</sub>q<sub>7</sub>q<sub>8</sub>，并设next[8] = 6，此时str = S[len - next[len]] = q<sub>1</sub>q<sub>2</sub>，</pre>
<pre>由字符串特征向量next的定义可知，q<sub>1</sub>q<sub>2</sub>q<sub>3</sub>q<sub>4</sub>q<sub>5</sub>q<sub>6 </sub>= q<sub>3</sub>q<sub>4</sub>q<sub>5</sub>q<sub>6</sub>q<sub>7</sub>q<sub>8</sub>，</pre>
<pre>即有q<sub>1</sub>q<sub>2</sub>＝q<sub>3</sub>q<sub>4</sub>，q<sub>3</sub>q<sub>4</sub>＝q<sub>5</sub>q<sub>6</sub>，q<sub>5</sub>q<sub>6</sub>＝q<sub>7</sub>q<sub>8</sub>，即q<sub>1</sub>q<sub>2</sub>为循环子串，且易知为最短循环子串。</pre>
<pre>由以上过程可知，若len可以被len - next[len]整除，则S存在循环子串，否则不存在。<br><br>解法：利用KMP算法，求字符串的特征向量next，若len可以被len - next[len]整除，</pre>
<pre>则最大循环次数n为len/(len - next[len])，否则为1。<br></pre>
<p>&nbsp;<span style="FONT-SIZE: 14pt"><strong><span style="COLOR: #3366ff">2、POJ 3461 </span></strong></span><span class=Apple style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: #000000; TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; widows: 2; orphans: 2"><span class=Apple style="FONT-FAMILY: Arial, Helvetica, sans-serif"><span style="FONT-SIZE: 14pt"><strong><span style="COLOR: #3366ff">Oulipo</span></strong></span></span></span></p>
<div id=c_jquery_test style="DISPLAY: none"></div>
<script type=text/javascript>
if ($ != jQuery) {
$ = jQuery.noConflict();
}
</script>
<img src ="http://www.cppblog.com/acronix/aggbug/124473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-08-23 21:39 <a href="http://www.cppblog.com/acronix/archive/2010/08/23/124473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>KM最佳匹配的模板</title><link>http://www.cppblog.com/acronix/archive/2010/08/21/124200.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Sat, 21 Aug 2010 10:01:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/08/21/124200.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/124200.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/08/21/124200.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/124200.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/124200.html</trackback:ping><description><![CDATA[<br><strong style="COLOR: #008000">以下为KM算法模板：</strong><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; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><strong><img id=Code_Closed_Image_175938 onclick="this.style.display='none'; Code_Closed_Text_175938.style.display='none'; Code_Open_Image_175938.style.display='inline'; Code_Open_Text_175938.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_175938 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_175938.style.display='none'; Code_Closed_Image_175938.style.display='inline'; Code_Closed_Text_175938.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_175938 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span></strong><span id=Code_Open_Text_175938 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><strong><span style="COLOR: #008000">//</span><span style="COLOR: #008000">boj1080&nbsp;</span></strong><span style="COLOR: #008000"><br><strong>/*</strong></span><strong><span style="COLOR: #008000">=================================================*\<br>|&nbsp;二分图最佳匹配（kuhn&nbsp;munkras&nbsp;算法O(m*m*n)）<br>|&nbsp;邻接距阵形式,复杂度O(m*m*n)&nbsp;返回最佳匹配值,传入二分图大小n,m<br>|&nbsp;邻接距阵map,表示权,&nbsp;match返回一个最佳匹配,未匹配顶点<br>|&nbsp;match值为-1,&nbsp;一定注意m&lt;=n,否则循环无法终止,最小权匹配可将权值<br>|&nbsp;取相反数<br><br>\*==================================================</span><span style="COLOR: #008000">*/</span></strong><span style="COLOR: #000000"><br><strong>#include&nbsp;</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include&nbsp;</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">memory.h</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;inf&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x7fffffff</span></strong><strong><span style="COLOR: #000000">;<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;map[</span><span style="COLOR: #000000">25</span><span style="COLOR: #000000">][</span><span style="COLOR: #000000">25</span><span style="COLOR: #000000">],n,lx[</span><span style="COLOR: #000000">25</span><span style="COLOR: #000000">],ly[</span><span style="COLOR: #000000">25</span><span style="COLOR: #000000">],match[</span><span style="COLOR: #000000">25</span></strong><strong><span style="COLOR: #000000">];<br></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;x[</span><span style="COLOR: #000000">25</span><span style="COLOR: #000000">],y[</span><span style="COLOR: #000000">25</span></strong><strong><span style="COLOR: #000000">];<br><br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">************&nbsp;寻找增广路*****************************</span><span style="COLOR: #008000">*/</span></strong><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;SearchPath(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;u)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x[u]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">x注意标记已匹配&nbsp;</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #000000">&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;v&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;v&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;v</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">y[v]&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;ly[v]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;lx[u]&nbsp;</span><span style="COLOR: #000000">==</span></strong><strong><span style="COLOR: #000000">&nbsp;map[u][v])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y[v]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(match[v]&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;</span><span style="COLOR: #000000">||</span></strong><strong><span style="COLOR: #000000">&nbsp;SearchPath(match[v]))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;match[v]&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span></strong><strong><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;KM()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;i,j,k,d;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(x,</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(x));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(y,</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(y));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(SearchPath(i))&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">找到完美匹配子图&nbsp;</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;inf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;j</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span></strong><strong><span style="COLOR: #000000">&nbsp;(x[j])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(k&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;k&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;k</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span></strong><strong><span style="COLOR: #000000">y[k])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(d&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;lx[j]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ly[k]&nbsp;</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">&nbsp;map[j][k])&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;lx[j]&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ly[k]&nbsp;</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">&nbsp;map[j][k];&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;j&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">降低阶梯&nbsp;</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(x[j])&nbsp;&nbsp;lx[j]&nbsp;</span><span style="COLOR: #000000">-=</span></strong><strong><span style="COLOR: #000000">&nbsp;d;<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;(y[j])&nbsp;&nbsp;ly[j]&nbsp;</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">&nbsp;d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ans&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">&nbsp;map[match[i]][i];&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span></strong><strong><span style="COLOR: #000000">&nbsp;ans;<br>}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">********************************************</span><span style="COLOR: #008000">*/</span></strong><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff"><strong>int</strong></span><strong><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;i,j,k,v;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n)&nbsp;</span><span style="COLOR: #000000">!=</span></strong><strong><span style="COLOR: #000000">&nbsp;EOF)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;j</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[i][j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">v;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008000">/*</span></strong><strong><span style="COLOR: #008000">*************&nbsp;顶标坐标初始化<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ly[i]初始化为0，lx[i]初始化为与i相邻边权最大的值&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*******************************</span><span style="COLOR: #008000">*/</span></strong><span style="COLOR: #000000"><br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(ly,</strong></span><strong><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(ly));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lx[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">inf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;j&nbsp;</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(lx[i]&nbsp;</span><span style="COLOR: #000000">&lt;</span></strong><strong><span style="COLOR: #000000">&nbsp;map[i][j])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lx[i]&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;map[i][j];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(match,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(match));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">KM());<br></span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">****************************************</span><span style="COLOR: #008000">*/</span></strong><span style="COLOR: #000000"><br><br><strong>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</strong></span><strong><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><span style="COLOR: #000000"><strong>;<br>}<br></strong></span></span></div>
<br><strong style="COLOR: #808000">同时<a href="http://acm.bjtu.edu.cn/problem/detail?pid=1084">BOJ 1084</a>也是一个很裸的求二分图最佳匹配的问题。</strong><br><br>
<img src ="http://www.cppblog.com/acronix/aggbug/124200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-08-21 18:01 <a href="http://www.cppblog.com/acronix/archive/2010/08/21/124200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二分图匹配算法总结</title><link>http://www.cppblog.com/acronix/archive/2010/08/21/124188.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Sat, 21 Aug 2010 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/08/21/124188.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/124188.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/08/21/124188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/124188.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/124188.html</trackback:ping><description><![CDATA[<p>二分图匹配算法总结</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-SIZE: 14pt"><strong>二分图最大匹配的匈牙利算法</strong></span>&nbsp; </p>
<p>&nbsp;二分图是这样一个图，它的顶点可以分类两个集合X和Y，所有的边关联在两个顶点中，恰好一个属于集合Ｘ，另一个属于集合Ｙ。 </p>
<p>最大匹配： 图中包含边数最多的匹配称为图的最大匹配。&nbsp; </p>
<p>完美匹配： 如果所有点都在匹配边上，称这个最大匹配是完美匹配。 </p>
<p>最小覆盖： 最小覆盖要求用最少的点（Ｘ集合或Ｙ集合的都行）让每条边都至少和其中一个点关联。可以证明：最少的点（即覆盖数）＝最大匹配数 </p>
<p>最小路径覆盖： </p>
<p>用尽量少的不相交简单路径覆盖有向无环图Ｇ的所有结点。解决此类问题可以建立一个二分图模型。把所有顶点i拆成两个：Ｘ结点集中的i和Y结点集中的i',如果有边i-&gt;j，则在二分图中引入边i-&gt;j'，设二分图最大匹配为m,则结果就是n-m。 </p>
<p>最大独立集问题： </p>
<p>在Ｎ个点的图G中选出m个点，使这m个点两两之间没有边．求m最大值． </p>
<p>如果图Ｇ满足二分图条件，则可以用二分图匹配来做．最大独立集点数 = N - 最大匹配数 </p>
<p>&nbsp;</p>
<p><span style="COLOR: #808000"><strong>二分图最大匹配问题的匈牙利算法：</strong></span> </p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><strong><img id=Code_Closed_Image_183705 onclick="this.style.display='none'; Code_Closed_Text_183705.style.display='none'; Code_Open_Image_183705.style.display='inline'; Code_Open_Text_183705.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_183705 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_183705.style.display='none'; Code_Closed_Image_183705.style.display='inline'; Code_Closed_Text_183705.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_183705 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span></strong><span id=Code_Open_Text_183705 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><strong><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;N&nbsp;202&nbsp;</span></strong><span style="COLOR: #000000"><br><br></span><strong><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;useif[N];&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">记录y中节点是否使用&nbsp;</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;link[N];&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">记录当前与y节点相连的x的节点&nbsp;</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mat[N][N];&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">记录连接x和y的边，如果i和j之间有边则为1，否则为0&nbsp;</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;gn,gm;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">二分图中x和y中点的数目&nbsp;</span></strong><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;can(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;t)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;i;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">gm;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(useif[i]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span></strong><strong><span style="COLOR: #000000">&nbsp;mat[t][i])&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;useif[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(link[i]</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span></strong><strong><span style="COLOR: #000000">&nbsp;can(link[i]))&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link[i]</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">t;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;&nbsp;<br>}&nbsp;<br><br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;MaxMatch()&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;i,num;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;um</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(link,</span><span style="COLOR: #000000">0xff</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(link));&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">gn;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(useif,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span></strong><strong><span style="COLOR: #000000">(useif));&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(can(i))&nbsp;num</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span></strong><span style="COLOR: #000000"><strong>&nbsp;num;&nbsp;<br>}&nbsp;<br><br></strong></span></span></div>
<p>&#160;</p>
<p>算法思想： </p>
<p>&nbsp;</p>
<p>算法的思路是不停的找增广轨,并增加匹配的个数,增广轨顾名思义是指一条可以使匹配数变多的路径,在匹配问题中,增广轨的表现形式是一条"交错轨",也就是说这条由图的边组成的路径,它的第一条边是目前还没有参与匹配的,第二条边参与了匹配,第三条边没有..最后一条边没有参与匹配,并且始点和终点还没有被选择过.这样交错进行,显然他有奇数条边.那么对于这样一条路径,我们可以将第一条边改为已匹配,第二条边改为未匹配...以此类推.也就是将所有的边进行"反色",容易发现这样修改以后,匹配仍然是合法的,但是匹配数增加了一对.另外,单独的一条连接两个未匹配点的边显然也是交错轨.可以证明,当不能再找到增广轨时,就得到了一个最大匹配.这也就是匈牙利算法的思路.</p>
<p>&nbsp;</p>
<p><strong style="COLOR: #808000">一、二分图最大匹配</strong></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 二分图最大匹配的经典匈牙利算法是由Edmonds在1965年提出的，算法的核心就是根据一个初始匹配不停的找增广路，直到没有增广路为止。</p>
<p>匈牙利算法的本质实际上和基于增广路特性的最大流算法还是相似的，只需要注意两点：</p>
<p>（一）每个X节点都最多做一次增广路的起点；</p>
<p>（二）如果一个Y节点已经匹配了，那么增广路到这儿的时候唯一的路径是走到Y节点的匹配点（可以回忆最大流算法中的后向边，这个时候后向边是可以增流的）。</p>
<p>&nbsp;&nbsp;&nbsp; 找增广路的时候既可以采用dfs也可以采用bfs，两者都可以保证O(nm)的复杂度，因为每找一条增广路的复杂度是O(m)，而最多增广n次，dfs在实际实现中更加简短。</p>
<p>&nbsp;</p>
<p><strong style="COLOR: #808000">二、Hopcroft-Karp算法</strong></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; SRbGa很早就介绍过这个算法，它可以做到O(sqrt(n)*e)的时间复杂度，并且在实际使用中效果不错而且算法本身并不复杂。</p>
<p>&nbsp;&nbsp;&nbsp; Hopcroft-Karp算法是Hopcroft和Karp在1972年提出的，该算法的主要思想是在每次增广的时候不是找一条增广路而是同时找几条不相交的最短增广路，形成极大增广路集，随后可以沿着这几条增广路同时进行增广。</p>
<p>&nbsp;&nbsp;&nbsp; 可以证明在寻找增广路集的每一个阶段所寻找到的最短增广路都具有相等的长度，并且随着算法的进行最短增广路的长度是越来越长的，更进一步的分析可以证明最多只需要增广ceil(sqrt(n))次就可以得到最大匹配（证明在这里略去）。</p>
<p>&nbsp;&nbsp;&nbsp; 因此现在的主要难度就是在O(e)的时间复杂度内找到极大最短增广路集，思路并不复杂，首先从所有X的未盖点进行BFS，BFS之后对每个X节点和Y节点维护距离标号，如果Y节点是未盖点那么就找到了一条最短增广路，BFS完之后就找到了最短增广路集，随后可以直接用DFS对所有允许弧(dist[y]=dist[x]+1，可以参见高流推进HLPP的实现)进行类似于匈牙利中寻找增广路的操作，这样就可以做到O(m)的复杂度。</p>
<p>&nbsp;&nbsp;&nbsp; 实现起来也并不复杂，对于两边各50000个点，200000条边的二分图最大匹配可以在1s内出解，效果很好：）</p>
<p>&nbsp;</p>
<p><strong style="COLOR: #808000">三、二分图最优匹配</strong></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 二分图最优匹配的经典算法是由Kuhn和Munkres独立提出的KM算法，值得一提的是最初的KM算法是在1955年和1957年提出的，因此当时的KM算法是以矩阵为基础的，随着匈牙利算法被Edmonds提出之后，现有的KM算法利用匈牙利树可以得到更漂亮的实现。</p>
<p>&nbsp;&nbsp;&nbsp; KM算法中的基本概念是可行顶标(feasible vertex labeling)，它是节点的实函数并且对于任意弧(x,y)满足l(x)+l(y)&#8805;w(x,y)，此外一个概念是相等子图，它是G的一个生成子图，但是只包含满足l(xi)+l(yj)=w(xi,yj)的所有弧(xi,yj)。</p>
<p>&nbsp;&nbsp;&nbsp; 有定理：如果相等子图有完美匹配，那么该匹配是最大权匹配，证明非常直观也非常简单，反设其他匹配是最优匹配，它的权必然比相等子图的完美匹配的权要小。</p>
<p>&nbsp;&nbsp;&nbsp; KM算法主要就是控制了怎样修改可行顶标的策略使得最终可以达到一个完美匹配，首先任意设置可行顶标（如每个X节点的可行顶标设为它出发的所有弧的最大权，Y节点的可行顶标设为0），然后在相等子图中寻找增广路，找到增广路就沿着增广路增广。</p>
<p>&nbsp;&nbsp;&nbsp; 而如果没有找到增广路呢，那么就考虑所有现在在匈牙利树中的X节点（记为S集合），所有现在在匈牙利树中的Y节点（记为T集合），考察所有一段在S集合，一段在not T集合中的弧，取</p>
<p>&nbsp;&nbsp;&nbsp; delta =&nbsp; min {l(xi)+l(yj)-w(xi,yj),xi &#8712; S, yj &#8712; not T}</p>
<p>&nbsp;&nbsp;&nbsp; 明显的，当我们把所有S集合中的l(xi)减少delta之后，一定会有至少一条属于(S,not T)的边进入相等子图，进而可以继续扩展匈牙利树，为了保证原来属于(S,T)的边不退出相等子图，把所有在T集合中的点的可行顶标增加delta。</p>
<p>&nbsp;&nbsp;&nbsp; 随后匈牙利树继续扩展，如果新加入匈牙利树的Y节点是未盖点，那么找到增广路，否则把该节点的对应的X匹配点加入匈牙利树继续尝试增广。</p>
<p>&nbsp;&nbsp;&nbsp; 复杂度分析：由于在不扩大匹配的情况下每次匈牙利树做如上调整之后至少增加一个元素，因此最多执行n次就可以找到一条增广路，最多需要找n条增广路，故最多执行n^2次修改顶标的操作，而每次修改顶标需要扫描所有弧，这样修改顶标的复杂度就是O(n^2)的，总的复杂度是O(n^4)的。</p>
<p>&nbsp;&nbsp;&nbsp; 事实上我现在看到的几个版本的实现都是这样实现的，但是实际效果还不错，因为这个界通常很难达到。</p>
<p>&nbsp;&nbsp;&nbsp; 对于not T的每个元素yj，定义松弛变量slack(yj) = min{l(xi)+l(yj)-w(xi,yj),xi &#8712; S}，很明显的每次的delta=min{slack(yj),yj&#8712; not T}，每次增广之后用O(n^2)的时间计算所有点的初始slack，由于生长匈牙利树的时候每条弧的顶标增量相同，因此修改每个slack需要常数时间（注意在修改顶标后和把已盖Y节点对应的X节点加入匈牙利树的时候是需要修改slack的）。这样修改所有slack值时间是O(n)的，每次增广后最多修改n次顶标，那么修改顶标的总时间降为O(n^2)，n次增广的总时间复杂度降为O(n^3)。事实上我这样实现之后对于大部分的数据可以比O(n^4)的算法快一倍左右。</p>
<p style="COLOR: #808000">&nbsp;</p>
<p><strong style="COLOR: #808000">四、二分图的相关性质</strong></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 本部分内容主要来自于SRbGa的黑书，因为比较简单，仅作提示性叙述。</p>
<p>&nbsp;&nbsp;&nbsp; (1) 二分图的最大匹配数等于最小覆盖数，即求最少的点使得每条边都至少和其中的一个点相关联，很显然直接取最大匹配的一段节点即可。</p>
<p>&nbsp;&nbsp;&nbsp; (2) 二分图的独立数等于顶点数减去最大匹配数，很显然的把最大匹配两端的点都从顶点集中去掉这个时候剩余的点是独立集，这是|V|-2*|M|，同时必然可以从每条匹配边的两端取一个点加入独立集并且保持其独立集性质。</p>
<p>(3) DAG的最小路径覆盖，将每个点拆点后作最大匹配，结果为n-m，求具体路径的时候顺着匹配边走就可以，匹配边i&#8594;j',j&#8594;k',k&#8594;l'....构成一条有向路径。</p>
<p>&nbsp;</p>
<p>【最优完备匹配】</p>
<p>对于二分图的每条边都有一个权（非负），要求一种完备匹配方案，使得所有匹配边的权和最大，记做最优完备匹配。（特殊的，当所有边的权为1时，就是最大完备匹配问题）</p>
<p>KM算法：（全称是Kuhn-Munkras，是这两个人在1957年提出的，有趣的是，匈牙利算法是在1965年提出的）</p>
<p>为每个点设立一个顶标Li，先不要去管它的意义。</p>
<p>设vi,j-为(i,j)边的权，如果可以求得一个完备匹配，使得每条匹配边vi,j=Li+Lj，其余边vi,j&#8804;Li+Lj。</p>
<p>此时的解就是最优的，因为匹配边的权和=∑Li，其余任意解的权和都不可能比这个大</p>
<p>&nbsp;</p>
<p>定理：二分图中所有vi,j=Li+Lj的边构成一个子图G，用匈牙利算法求G中的最大匹配，如果该匹配是完备匹配，则是最优完备匹配。</p>
<p>&nbsp;</p>
<p>问题是，现在连Li的意义还不清楚。</p>
<p>其实，我们现在要求的就是L的值，使得在该L值下达到最优完备匹配。</p>
<p>&nbsp;</p>
<p>L初始化：</p>
<p>Li=max{wi,j}(i&#8712;x,j&#8712;y)</p>
<p>Lj=0</p>
<p>&nbsp;</p>
<p>建立子图G，用匈牙利算法求G的最大匹配，如果在某点i (i&#8712;x)找不到增广轨，则得不到完备匹配。</p>
<p>此时需要对L做一些调整：</p>
<p>设S为寻找从i出发的增广轨时访问的x中的点的集合，T为访问的y中的点的集合。</p>
<p>找到一个改进量dx，dx=min{Li+Lj-wi,j}(i&#8712;S,j不&#8712;T)</p>
<p>Li=Li-dx (i&#8712;S)</p>
<p>Li=Li+dx (i&#8712;T)</p>
<p>&nbsp;</p>
<p>重复以上过程，不断的调整L，直到求出完备匹配为止。</p>
<p>&nbsp;</p>
<p>从调整过程中可以看出：</p>
<p>每次调整后新子图中在包含原子图中所有的边的基础上添加了一些新边。</p>
<p>每次调整后∑Li会减少dx，由于每次dx取最小，所以保证了解的最优性。</p>
<p>&nbsp;</p>
<p>复杂度分析：</p>
<p>设n为点数，m为边数，从每个点出发寻找增广轨的复杂度是O(m)，如果找不到增广轨，对L做调整的复杂度也是O(m)，而一次调整或者找到一条增广轨，或者将两个连通分量合成一个，而这两种情况最多都只进行O(n)次，所以总的复杂度是O(nm)</p>
<p>&nbsp;</p>
<p>扩展：</p>
<p>根据KM算法的实质，可以求出使得所有匹配边的权和最小的匹配方案。</p>
<p>&nbsp;</p>
<p>L初始化：</p>
<p>Li=min{wi,j}(i&#8712;x,j&#8712;y)</p>
<p>Lj=0</p>
<p>dx=min{wi,j-Li-Lj}(i&#8712;S,j不&#8712;T)</p>
<p>Li=Li+dx (i&#8712;S)</p>
<p>Li=Li-dx (i&#8712;T)</p>
<p>【最优匹配】</p>
<p>与最优完备匹配很相似，但不必以完备匹配为前提。</p>
<p>只要对KM算法作一些修改就可以了：</p>
<p>将原图转换成完全二分图（m=|x||y|），添加原图中不存在的边，并且设该边的权值为0。</p>
<img src ="http://www.cppblog.com/acronix/aggbug/124188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-08-21 15:39 <a href="http://www.cppblog.com/acronix/archive/2010/08/21/124188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二分图最大匹配总结</title><link>http://www.cppblog.com/acronix/archive/2010/08/21/124175.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Sat, 21 Aug 2010 05:40:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/08/21/124175.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/124175.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/08/21/124175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/124175.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/124175.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em"><span style="COLOR: #993366"><strong style="FONT-SIZE: 14pt">1。一个二分图中的最大匹配数等于这个图中的最小点覆盖数</strong></span></p>
<p style="TEXT-INDENT: 2em"><span style="COLOR: #0000ff">【转自Matirx67】二分图最大匹配的K&#246;nig定理及其证明<br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;本文将是这一系列里最短的一篇，因为我只打算把K&#246;nig定理证了，其它的废话一概没有。<br>&nbsp;&nbsp;&nbsp;&nbsp;以下五个问题我可能会在以后的文章里说，如果你现在很想知道的话，网上去找找答案：<br>&nbsp;&nbsp;&nbsp;&nbsp;1. 什么是二分图；<br>&nbsp;&nbsp;&nbsp;&nbsp;2. 什么是二分图的匹配；<br>&nbsp;&nbsp;&nbsp;&nbsp;3. 什么是匈牙利算法；(http://www.matrix67.com/blog/article.asp?id=41)<br>&nbsp;&nbsp;&nbsp;&nbsp;4. K&#246;nig定理证到了有什么用；<br>&nbsp;&nbsp;&nbsp;&nbsp;5. 为什么o上面有两个点。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;K&#246;nig定理是一个二分图中很重要的定理，它的意思是，<span style="COLOR: #ff00ff">一个二分图中的最大匹配数等于这个图中的最小点覆盖数。如果你还不知道什么是最小点覆盖，我也在这里说一下：假如选了一个点就相当于覆盖了以它为端点的所有边，你需要选择最少的点来覆盖所有的边。</span>比如，下面这个图中的最大匹配和最小点覆盖已分别用蓝色和红色标注。它们都等于3。这个定理相信大多数人都知道，但是网络上给出的证明并不多见。有一些网上常见的&#8220;证明&#8221;明显是错误的。因此，我在这里写一下这个定理的证明，希望对大家有所帮助。<br><br><img alt="" src="http://www.matrix67.com/blogimage/200612021.GIF" border=0><br><br>&nbsp;&nbsp;&nbsp;&nbsp;假如我们已经通过匈牙利算法求出了最大匹配（假设它等于M），下面给出的方法可以告诉我们，选哪M个点可以覆盖所有的边。<br>&nbsp;&nbsp;&nbsp;&nbsp;匈牙利算法需要我们从右边的某个没有匹配的点，走出一条使得&#8220;一条没被匹配、一条已经匹配过，再下一条又没匹配这样交替地出现&#8221;的路（交错轨，增广路）。但是，现在我们已经找到了最大匹配，已经不存在这样的路了。换句话说，我们能寻找到很多可能的增广路，但最后都以找不到&#8220;终点是还没有匹配过的点&#8221;而失败。我们给所有这样的点打上记号：从右边的所有没有匹配过的点出发，按照增广路的&#8220;交替出现&#8221;的要求可以走到的所有点（最后走出的路径是很多条不完整的增广路）。那么这些点组成了最小覆盖点集：右边所有没有打上记号的点，加上左边已经有记号的点。看图，右图中展示了两条这样的路径，标记了一共6个点（用 &#8220;&#8730;&#8221;表示）。那么，用红色圈起来的三个点就是我们的最小覆盖点集。<br>&nbsp;&nbsp;&nbsp;&nbsp;首先，为什么这样得到的点集点的个数恰好有M个呢？答案很简单，因为每个点都是某个匹配边的其中一个端点。如果右边的哪个点是没有匹配过的，那么它早就当成起点被标记了；如果左边的哪个点是没有匹配过的，那就走不到它那里去（否则就找到了一条完整的增广路）。而一个匹配边又不可能左端点是标记了的，同时右端点是没标记的（不然的话右边的点就可以经过这条边到达了）。因此，最后我们圈起来的点与匹配边一一对应。<br>&nbsp;&nbsp;&nbsp;&nbsp;其次，为什么这样得到的点集可以覆盖所有的边呢？答案同样简单。不可能存在某一条边，它的左端点是没有标记的，而右端点是有标记的。原因如下：如果这条边不属于我们的匹配边，那么左端点就可以通过这条边到达（从而得到标记）；如果这条边属于我们的匹配边，那么右端点不可能是一条路径的起点，于是它的标记只能是从这条边的左端点过来的（想想匹配的定义），左端点就应该有标记。<br>&nbsp;&nbsp;&nbsp;&nbsp;最后，为什么这是最小的点覆盖集呢？这当然是最小的，不可能有比M还小的点覆盖集了，因为要覆盖这M条匹配边至少就需要M个点（再次回到匹配的定义）。<br>&nbsp;&nbsp;&nbsp;&nbsp;证完了。<br><br><strong style="FONT-SIZE: 14pt; COLOR: #800080">2。最小路径覆盖=最小路径覆盖＝｜G｜－最大匹配数<br></strong><br>&nbsp;在一个N*N的有向图中，<span style="COLOR: #ff00ff">路径覆盖就是在图中找一些路经，使之覆盖了图中的所有顶点，<br>&nbsp;且任何一个顶点有且只有一条路径与之关联；（如果把这些路径中的每条路径从它的起始点走到它的终点，<br>&nbsp;那么恰好可以经过图中的每个顶点一次且仅一次）；如果不考虑图中存在回路，那么每每条路径就是一个弱连通子集．<br></span>&nbsp;eg. 图4*4的图G的最小路径覆盖，包含2条路径: p1-&gt;p3, p2-&gt;p4 </p>
<p>&nbsp;由上面可以得出：</p>
<p>&nbsp;1.一个单独的顶点是一条路径；<br>&nbsp;2.如果存在一路径p1,p2,......pk，其中p1 为起点，pk为终点，那么在覆盖图中，顶点p1,p2,......pk不再与其它的<br>&nbsp;&nbsp; 顶点之间存在有向边．</p>
<p>&nbsp;最小路径覆盖就是找出最小的路径条数，使之成为G的一个路径覆盖．</p>
<p>&nbsp;路径覆盖与二分图匹配的关系：最小路径覆盖＝｜G｜－最大匹配数；</p>
<p>&nbsp;其中最大匹配数的求法是把G中的每个顶点pi分成两个顶点pi'与pi''，如果在p中存在一条pi到pj的边，那么在<br>&nbsp;二分图G'中就有一条连接pi'与pj''的无向边；这里pi' 就是p中pi的出边，pj''就是p中pj 的一条入边；</p>
<p>&nbsp;对于公式：最小路径覆盖＝｜G｜－最大匹配数；可以这么来理解；</p>
<p>&nbsp;如果匹配数为零，那么Ｐ中不存在有向边，于是显然有：<br>&nbsp;最小路径覆盖＝｜G｜－最大匹配数＝｜G｜－０＝｜G｜；即Ｐ的最小路径覆盖数为｜G｜；</p>
<p>&nbsp;G'中不在于匹配边时，路径覆盖数为｜G｜;</p>
<p>&nbsp;如果在G'中增加一条匹配边pi'-&gt;pj''，那么在图P的路径覆盖中就存在一条由pi连接pj的边，也就是说pi与pj 在<br>&nbsp;一条路径上，于是路径覆盖数就可以减少一个；如此继续增加匹配边，每增加一条，路径覆盖数就减少一条；<br>&nbsp;直到匹配边不能继续增加时，路径覆盖数也不能再减少了，此时就有了前面的公式；但是这里只是说话了每条匹配边<br>&nbsp;对应于路径覆盖中的一条路径上的一条连接两个点之间的有向边；下面来说明一个路径覆盖中的每条连接两个顶点之<br>&nbsp;间的有向边对应于一条匹配边。</p>
<p><span style="FONT-SIZE: 14pt; COLOR: #800080"><strong>3。二分图最大独立集=顶点数-二分图最大匹配</strong></span></p>
<p style="TEXT-INDENT: 2em"><span style="COLOR: #ff00ff">独立集：图中任意两个顶点都不相连的顶点集合。</span><br></p>
<img src ="http://www.cppblog.com/acronix/aggbug/124175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-08-21 13:40 <a href="http://www.cppblog.com/acronix/archive/2010/08/21/124175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>暑期任务2010</title><link>http://www.cppblog.com/acronix/archive/2010/08/20/124119.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Fri, 20 Aug 2010 11:10:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/08/20/124119.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/124119.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/08/20/124119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/124119.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/124119.html</trackback:ping><description><![CDATA[<p>POJ推荐50题 —— 参加10年暑假集训时要求完成 </p>
<p>&nbsp;</p>
<p>记住写解题报告和解题总结！！<br>&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;<br>POJ == 北京大学ACM在线评测系统 <img src="http://forum.byr.edu.cn/wForum/pic/url.gif" align=absMiddle border=0><a href="http://acm.pku.edu.cn/JudgeOnline" target=_blank><u><font color=#800080>http://acm.pku.edu.cn/JudgeOnline</font></u></a></p>
<p>第一类 动态规划 (至少6题，2479 and 2593必做) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2479" target=_blank><u><font color=#0000ff>2479</font></u></a> and <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2593" target=_blank><u><font color=#0000ff>2593</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1015" target=_blank><u><font color=#0000ff>1015</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1042" target=_blank><u><font color=#0000ff>1042</font></u></a> (也可贪心) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1141" target=_blank><u><font color=#0000ff>1141</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1050" target=_blank><u><font color=#800080>1050</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1080" target=_blank><u><font color=#0000ff>1080</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1221" target=_blank><u><font color=#0000ff>1221</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1260" target=_blank><u><font color=#0000ff>1260</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2411" target=_blank><u><font color=#0000ff>2411</font></u></a> (稍难) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1276" target=_blank><u><font color=#0000ff>1276</font></u></a> <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第二类 搜索 (至少4题) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1011" target=_blank><u><font color=#0000ff>1011</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1033" target=_blank><u><font color=#0000ff>1033</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1129" target=_blank><u><font color=#0000ff>1129</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2049" target=_blank><u><font color=#0000ff>2049</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2056" target=_blank><u><font color=#0000ff>2056</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2488" target=_blank><u><font color=#0000ff>2488</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2492" target=_blank><u><font color=#0000ff>2492</font></u></a> (稍难，也可并查集) <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第三类 贪心 (至少2题) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1065" target=_blank><u><font color=#0000ff>1065</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2054" target=_blank><u><font color=#0000ff>2054</font></u></a> (难) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1521" target=_blank><u><font color=#0000ff>1521</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2709" target=_blank><u><font color=#0000ff>2709</font></u></a> <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第四类 最短路 (至少3题)&nbsp;<br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1062" target=_blank><u><font color=#0000ff>1062</font></u></a> 昂贵的聘礼(直接dfs，或者枚举等级区间+floyd)<br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1125" target=_blank><u><font color=#0000ff>1125</font></u></a> Stockbroker Grapevine （Prim求两两最短路）<br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1797" target=_blank><u><font color=#0000ff>1797</font></u></a>Heavy Transportation&nbsp;(Dijsktra的变形，实质贪心)<br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2253" target=_blank><u><font color=#0000ff>2253</font></u></a> （同1797，贪心）</p>
<p><span style="COLOR: #800000">上两题贪心（Dijsktra）的证明</span><br><span style="COLOR: #800000">d[i] = max ( d[i], min（d[u], map[u][i]）) d[u]是当前进入访问点集合的点。</span><br><span style="COLOR: #800000">S为已访问的点集。</span><br><br><span style="COLOR: #800000">定理 每次加入的S的点u，d[u]就是题目所求最大载重。</span><br><span style="COLOR: #800000">证明</span><br><span style="COLOR: #800000">每次加入S的点u为当前d值最大的点，所以未访问的点集中没有点可以对u进行松弛操作(若t能对u进行松弛操作，</span></p>
<p><span style="COLOR: #800000">则有d[t]&gt;d[u])。而S中的顶点也都进行了松弛操作，所以D的值不会改变。定理得证</span>。</p>
<p>&nbsp;</p>
<p><span style="COLOR: #808000">亦可用Floyd，稍作修改即可，而dis[i][j]意义为 i ，j 之间符合题意的最优值，</span></p>
<p><span style="COLOR: #808000">在三重循环用k值不断更新dis[i][j]</span></p>
<p><span style="COLOR: #808000">具体见：<a href="http://blog.sina.com.cn/s/blog_5f5353cc0100gnxu.html"><u><font color=#0000ff>http://blog.sina.com.cn/s/blog_5f5353cc0100gnxu.html</font></u></a></span></p>
<p><span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 据说还能用最小生成树和最大生成树做上两题，会了再说吧</span></p>
<p>&nbsp;</p>
<p>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2679" target=_blank><u><font color=#0000ff>2679</font></u></a> Bellman-Ford (难) <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第五类 最小生成树 (至少2题, 而且 Prim 和 Kruskal 至少各用一次) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1251" target=_blank><u><font color=#0000ff>1251</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1258" target=_blank><u><font color=#0000ff>1258</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1789" target=_blank><u><font color=#0000ff>1789</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2485" target=_blank><u><font color=#0000ff>2485</font></u></a> <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第六类 最大流 (至少2题) </p>
<p><br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1087" target=_blank><u><font color=#800080>1087</font></u></a> A Plug for UNIX(dinic模板完美使用)<br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1459" target=_blank><u><font color=#800080>1459</font></u></a> Power Network（dinic模板完美使用）<br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1149" target=_blank><u><font color=#800080>1149</font></u></a> Pigs(建模得动点脑筋)</p>
<p>&nbsp;</p>
<p><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1966" target=_blank><u><font color=#0000ff>1966<br></font></u></a>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2516" target=_blank><u><font color=#0000ff>2516</font></u></a> (最小费用最大流) (难)&nbsp;<br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2711" target=_blank><u><font color=#0000ff>2711</font></u></a></p>
<p>&nbsp;</p>
<p><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3469" target=_blank><u><font color=#0000ff>3469</font></u></a>&nbsp;&nbsp;</p>
<p>&nbsp;</p>
<p><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3498" target=_blank><u><font color=#800080>3498</font></u></a></p>
<p><br>&nbsp;<br>第七类 二分图 (至少3题) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1325" target=_blank><u><font color=#800080>1325</font></u></a> Machine Schedule(匈牙利算法初步)<br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1469" target=_blank><u><font color=#0000ff>1469</font></u></a> course（全裸的二分最大匹配）<br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2195" target=_blank><u><font color=#0000ff>2195</font></u></a> (KM 算法或最小费用最大流) (难) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2446" target=_blank><u><font color=#0000ff>2446</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1422" target=_blank><u><font color=#0000ff>1422</font></u></a> and <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2594" target=_blank><u><font color=#0000ff>2594</font></u></a> <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第八类 并查集 (至少2题) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1861" target=_blank><u><font color=#0000ff>1861</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1182" target=_blank><u><font color=#0000ff>1182</font></u></a> (难) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1308" target=_blank><u><font color=#0000ff>1308</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2524" target=_blank><u><font color=#0000ff>2524</font></u></a> <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第九类 快速查找 (B-Search, Hash and so on) (至少3题) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2503" target=_blank><u><font color=#0000ff>2503</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2513" target=_blank><u><font color=#0000ff>2513</font></u></a> (+Euler回路的判定) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1035" target=_blank><u><font color=#0000ff>1035</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1200" target=_blank><u><font color=#0000ff>1200</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2002" target=_blank><u><font color=#0000ff>2002</font></u></a> <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第十类 数论 (至少2题) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1061" target=_blank><u><font color=#800080>1061</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1142" target=_blank><u><font color=#0000ff>1142</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2262" target=_blank><u><font color=#0000ff>2262</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2407" target=_blank><u><font color=#0000ff>2407</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1811" target=_blank><u><font color=#0000ff>1811</font></u></a>(难) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2447" target=_blank><u><font color=#0000ff>2447</font></u></a> (难) <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第十一类 线段树 (无最少题数要求) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2352" target=_blank><u><font color=#0000ff>2352</font></u></a> (可用简单方法) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2528" target=_blank><u><font color=#0000ff>2528</font></u></a> <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第十二类 计算几何 (至少2题，1113凸包算法必做) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1113" target=_blank><u><font color=#0000ff>1113</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1292" target=_blank><u><font color=#0000ff>1292</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2148" target=_blank><u><font color=#0000ff>2148</font></u></a> (难) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2653" target=_blank><u><font color=#0000ff>2653</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1584" target=_blank><u><font color=#0000ff>1584</font></u></a> <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第十三类 高精度 (至少3题，1001必做) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1001" target=_blank><u><font color=#800080>1001</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1047" target=_blank><u><font color=#0000ff>1047</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1131" target=_blank><u><font color=#0000ff>1131</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1503" target=_blank><u><font color=#0000ff>1503</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1504" target=_blank><u><font color=#0000ff>1504</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1060" target=_blank><u><font color=#0000ff>1060</font></u></a> and <a href="http://acm.pku.edu.cn/JudgeOnline/problem? nullnull&nbsp;nullid=1996" target=_blank><u><font color=#0000ff>1996</font></u></a> (多项式) <br>&nbsp;<br>SCU1002, 1003, 1004 (<img src="http://forum.byr.edu.cn/wForum/pic/url.gif" align=absMiddle border=0><a href="http://acm.scu.edu.cn/soj" target=_blank><u><font color=#0000ff>http://acm.scu.edu.cn/soj</font></u></a>) <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第十四类 模拟 (至少5题) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1029" target=_blank><u><font color=#0000ff>1029</font></u></a> and <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1013" target=_blank><u><font color=#0000ff>1013</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1083" target=_blank><u><font color=#0000ff>1083</font></u></a> and <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2028" target=_blank><u><font color=#0000ff>2028</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2234" target=_blank><u><font color=#0000ff>2234</font></u></a> and <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1067" target=_blank><u><font color=#0000ff>1067</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1012" target=_blank><u><font color=#0000ff>1012</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1026" target=_blank><u><font color=#0000ff>1026</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1068" target=_blank><u><font color=#0000ff>1068</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1120" target=_blank><u><font color=#0000ff>1120</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2271" target=_blank><u><font color=#0000ff>2271</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2632" target=_blank><u><font color=#0000ff>2632</font></u></a> <br>&nbsp;<br>&nbsp; <br>&nbsp;<br>第十五类 数学 (至少4题) <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2249" target=_blank><u><font color=#0000ff>2249</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1023" target=_blank><u><font color=#0000ff>1023</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=2506" target=_blank><u><font color=#0000ff>2506</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1079" target=_blank><u><font color=#0000ff>1079</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1019" target=_blank><u><font color=#0000ff>1019</font></u></a> and <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1095" target=_blank><u><font color=#0000ff>1095</font></u></a> <br>&nbsp;<br><a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1905" target=_blank><u><font color=#0000ff>1905</font></u></a> and <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1064" target=_blank><u><font color=#0000ff>1064</font></u></a> (二分)&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;<br>&nbsp;<br><img src="http://forum.byr.edu.cn/wForum/pic/url.gif" align=absMiddle border=0><a href="http://forum.byr.edu.cn/wForum/board.php?name=ACM_ICPC" target=_blank><u><font color=#0000ff>http://forum.byr.edu.cn/wForum/board.php?name=ACM_ICPC</font></u></a> <br>&nbsp;<br>BUPT ACM FTP <br>&nbsp;<br>Address: <img src="http://forum.byr.edu.cn/wForum/pic/url.gif" align=absMiddle border=0><a href="ftp://www.cs.bupt.cn/acm" target=_blank><u><font color=#0000ff>ftp://www.cs.bupt.cn/acm</font></u></a> <br>&nbsp;<br>ID: acmguest <br>&nbsp;<br>PASSWORD: acmftp <br></p>
<img src ="http://www.cppblog.com/acronix/aggbug/124119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-08-20 19:10 <a href="http://www.cppblog.com/acronix/archive/2010/08/20/124119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hdu_3256 Computer Assembling(一起来感受dinic的魅力吧)</title><link>http://www.cppblog.com/acronix/archive/2010/08/20/124115.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Fri, 20 Aug 2010 10:20:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/08/20/124115.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/124115.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/08/20/124115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/124115.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/124115.html</trackback:ping><description><![CDATA[<p><strong style="COLOR: #800080">题意：电脑装机，要买 N 个配件，现有两家公司A 、B分别有这些配件，但价格不同，现在要求买完配件所用最少的价钱，同时若两配件来自不同的公司，考虑兼容性，可能要花而外的钱买转换器。</strong><br><br><strong style="COLOR: #3366ff">分析：最小割转换到最大流，n个配件，n个顶点，源点连向各顶点的边表示A公司的配件，边权表示A公司的该配件的价钱;各顶点连向汇点的边表示B公司的配件，边权表示B公司的该配件的价格。当两配件来自不同公司有兼容性问题时，对应的顶点连双向边，边权为转换器的价格。构图完成，很显然，此图的最小割便是所求，因而可用求最大流即可。</strong><br><br><span style="COLOR: #808000"><strong>收获：因为此题数据顶点和边的数量都很大，朴素的最大流勉强能应付，但用dinic求最大流，那速度可是相当的快，几倍的差别，甚至是TLE 和 AC的差别。所以好好用好魅力无穷的Dinic吧~~~</strong></span><br><br><br><span style="COLOR: #008000"><strong>cpp代码：</strong></span><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><strong><img id=Code_Closed_Image_181755 onclick="this.style.display='none'; Code_Closed_Text_181755.style.display='none'; Code_Open_Image_181755.style.display='inline'; Code_Open_Text_181755.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 align=top><img id=Code_Open_Image_181755 style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text_181755.style.display='none'; Code_Closed_Image_181755.style.display='inline'; Code_Closed_Text_181755.style.display='inline';" height=16 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><span id=Code_Closed_Text_181755 style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span></strong><span id=Code_Open_Text_181755 style="DISPLAY: none"><br><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><strong><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">cstdio</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br><strong>#include&nbsp;</strong></span><strong><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">algorithm</span><span style="COLOR: #000000">&gt;</span></strong><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">namespace</span></strong><strong><span style="COLOR: #000000">&nbsp;std;<br><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;inf&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">28</span></strong><strong><span style="COLOR: #000000">;<br><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;Max&nbsp;510</span></strong><span style="COLOR: #000000"><br></span><strong><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;flow[Max][Max],d[Max];&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">flow&nbsp;is&nbsp;the&nbsp;network</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sta,end,N,n,m;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">sta&nbsp;is&nbsp;the&nbsp;sourse&nbsp;,end&nbsp;is&nbsp;the&nbsp;end,N&nbsp;is&nbsp;the&nbsp;number&nbsp;of&nbsp;vector</span></strong><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff"><strong>int</strong></span><strong><span style="COLOR: #000000">&nbsp;q[Max];<br><br></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;bfs(</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;s)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;front</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,rear</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;end;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">d[]&nbsp;is&nbsp;the&nbsp;deep</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q[rear</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">s;&nbsp;&nbsp;d[s]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(front</span><span style="COLOR: #000000">&lt;</span></strong><strong><span style="COLOR: #000000">rear)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">q[front</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">N;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&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">(flow[k][i]</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">d[i]</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[i]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">d[k]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q[rear</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(d[end]</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span></strong><strong><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dinic(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;k,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sum)&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">k&nbsp;is&nbsp;the&nbsp;sourse</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #000000">{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(k</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">end)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span></strong><strong><span style="COLOR: #000000">&nbsp;sum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;os&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;sum;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">N</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">sum;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(d[i]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">d[k]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">flow[k][i]</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">dinic(i,min(sum,flow[k][i]));&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Deep&nbsp;to&nbsp;the&nbsp;end.</span></strong><span style="COLOR: #008000"><br></span><strong><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flow[k][i]&nbsp;</span><span style="COLOR: #000000">-=</span></strong><strong><span style="COLOR: #000000">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flow[i][k]&nbsp;</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;</span><span style="COLOR: #000000">-=</span></strong><strong><span style="COLOR: #000000">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;os</span><span style="COLOR: #000000">-</span></strong><strong><span style="COLOR: #000000">sum;<br>}<br><br></span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span></strong><strong><span style="COLOR: #000000">&nbsp;i,j,x,y,v;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">n,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m)&nbsp;</span><span style="COLOR: #000000">!=</span></strong><strong><span style="COLOR: #000000">&nbsp;EOF)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sta&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;end&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;n</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;end;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;end;&nbsp;j</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flow[i][j]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">flow[sta][i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;n;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">flow[i][end]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;m;&nbsp;i</span><span style="COLOR: #000000">++</span></strong><strong><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;%d&nbsp;%d</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">x,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">y,&nbsp;</span><span style="COLOR: #000000">&amp;</span></strong><strong><span style="COLOR: #000000">v);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flow[x][y]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;flow[y][x]&nbsp;</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">&nbsp;v;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ret</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span></strong><strong><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N&nbsp;</span><span style="COLOR: #000000">=</span></strong><strong><span style="COLOR: #000000">&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span></strong><strong><span style="COLOR: #000000">(bfs(sta))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="COLOR: #000000">+=</span></strong><strong><span style="COLOR: #000000">&nbsp;dinic(sta,inf);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span></strong><strong><span style="COLOR: #000000">,ret);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span></strong><span style="COLOR: #000000"><strong>;<br>}<br></strong></span></span></div>
<img src ="http://www.cppblog.com/acronix/aggbug/124115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-08-20 18:20 <a href="http://www.cppblog.com/acronix/archive/2010/08/20/124115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>poj_1149 PIGS(值得一做的最大流)</title><link>http://www.cppblog.com/acronix/archive/2010/08/20/124108.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Fri, 20 Aug 2010 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/08/20/124108.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/124108.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/08/20/124108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/124108.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/124108.html</trackback:ping><description><![CDATA[<p><span style="COLOR: #0000ff"><strong><br>以下解析来自</strong></span>：<a href="http://imlazy.ycool.com/post.2059102.html"><strong>http://imlazy.ycool.com/post.2059102.html</strong></a><br><br><a class=post_title href="http://imlazy.ycool.com/post.2059102.html" rel=follow><strong><font color=#005b7a>PKU 1149， PIGS，构造网络流模型时，要注意合并节点和边</font></strong></a><br><br>&nbsp; <a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=1149" target=_blank><font color=#005b7a>这道题目</font></a>的大意是这样的：<br></p>
<ul>
    <li>有 M 个猪圈（M &#8804; 1000），每个猪圈里初始时有若干头猪。
    <li>一开始所有猪圈都是关闭的。
    <li>依次来了 N 个顾客（N &#8804; 100），每个顾客分别会打开指定的几个猪圈，从中买若干头猪。
    <li>每个顾客分别都有他能够买的数量的上限。
    <li>每个顾客走后，他打开的那些猪圈中的猪，都可以被任意地调换到其它开着的猪圈里，然后所有猪圈重新关上。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 问总共最多能卖出多少头猪。<br><br>&nbsp;&nbsp;&nbsp; 举个例子来说。有 3 个猪圈，初始时分别有 3、 1 和 10 头猪。依次来了 3 个顾客，第一个打开 1 号 和 2 号猪圈，最多买 2 头；第二个打开 1 号 和 3 号猪圈，最多买 3 头；第三个打开 2 号猪圈，最多买 6 头。那么，最好的可能性之一就是第一个顾客从 1 号圈买 2 头，然后把 1 号圈剩下的 1 头放到 2 号圈；第二个顾客从 3 号圈买 3 头；第三个顾客从 2 号圈买 2 头。总共卖出 2 + 3 + 2 = 7 头。□<br><br>&nbsp;&nbsp;&nbsp; 不难想像，这个问题的网络模型可以很直观地构造出来。就拿上面的例子来说，可以构造出<a href="http://imlazy.ycool.com/post.2059102.html#pic1"><font color=#005b7a>图 1</font></a> 所示的模型（图中凡是没有标数字的边，容量都是 +&#8734;）：<br></p>
<ul>
    <li>三个顾客，就有三轮交易，每一轮分别都有 3 个猪圈和 1 个顾客的节点。
    <li>从源点到第一轮的各个猪圈各有一条边，容量就是各个猪圈里的猪的初始数量。
    <li>从各个顾客到汇点各有一条边，容量就是各个顾客能买的数量上限。
    <li>在某一轮中，从该顾客打开的所有猪圈都有一条边连向该顾客，容量都是 +&#8734;。
    <li>最后一轮除外，从每一轮的 i 号猪圈都有一条边连向下一轮的 i 号猪圈，容量都是 +&#8734;，表示这一轮剩下的猪可以留到下一轮。
    <li>最后一轮除外，从每一轮被打开的所有猪圈，到下一轮的同样这些猪圈，两两之间都要连一条边，表示它们之间可以任意流通。 </li>
</ul>
<p><br><a name=pic1></a></p>
<div align=center><img alt="" src="http://node0.foto.ycstatic.com/200805/27/8/26453784.jpg" align=middle border=0><br></div>
<p><br>&nbsp;</p>
<div align=center>图 1<br></div>
<p><br>&nbsp;&nbsp;&nbsp; 不难想像，这个网络模型的最大流量就是最多能卖出的数量。图中最多有 2 + N + M &#215; N ≈ 100,000 个节点。□<br><br>&nbsp;&nbsp;&nbsp; 这个模型虽然很直观，但是节点数太多了，计算速度肯定会很慢。其实不用再想别的算法，就让我们继续上面的例子，用合并的方法来简化这个网络模型。<br><br>&nbsp;&nbsp;&nbsp; 首先，最后一轮中没有打开的猪圈就可以从图中删掉了，也就是<a href="http://imlazy.ycool.com/post.2059102.html#pic2"><font color=#005b7a>图 2</font></a> 中<font color=#ca0000>红色</font>的部分，显然它们对整个网络的流量没有任何影响。<br><br><a name=pic2></a></p>
<div align=center><img alt="" src="http://node1.foto.ycstatic.com/200805/27/8/26456344.jpg" align=middle border=0><br><br>图 2<br></div>
<p><br>&nbsp;&nbsp;&nbsp; 接着，看<a href="http://imlazy.ycool.com/post.2059102.html#pic2"><font color=#005b7a>图 2</font></a> 中<font color=#000099>蓝色</font>的部分。根据我总结出的以下几个规律，可以把这 4 个点合并成一个：<br><br>&nbsp;&nbsp;&nbsp; <a name=rule1><strong><font color=#005b7a>规律 1</font></strong></a>. 如果几个节点的流量的<strong>来源</strong>完全相同，则可以把它们合并成一个。<br><br>&nbsp;&nbsp;&nbsp; <a name=rule2><strong><font color=#005b7a>规律 2</font></strong></a>. 如果几个节点的流量的<strong>去向</strong>完全相同，则可以把它们合并成一个。<br><br>&nbsp;&nbsp;&nbsp; <a name=rule3><strong><font color=#005b7a>规律 3</font></strong></a>. 如果从点 u 到点 v 有一条容量为 +&#8734; 的边，并且 u 是 v 的<strong>唯一</strong>流量<strong>来源</strong>，或者 v 是 u 的<strong>唯一</strong>流量<strong>去向</strong>，则可以把 u 和 v 合并成一个节点。<br><br>&nbsp;&nbsp;&nbsp; 根据<a href="http://imlazy.ycool.com/post.2059102.html#rule1"><font color=#005b7a>规律 1</font></a>，可以把<font color=#000099>蓝色</font>部分右边的 1、 2 号节点合并成一个；根据<a href="http://imlazy.ycool.com/post.2059102.html#rule2"><font color=#005b7a>规律 2</font></a>，可以把<font color=#000099>蓝色</font>部分左边的 1、 2 号节点合并成一个；最后，根据<a href="http://imlazy.ycool.com/post.2059102.html#rule3"><font color=#005b7a>规律 3</font></a>，可以把<font color=#000099>蓝色</font>部分的左边和右边（已经分别合并成了一个节点）合并成一个节点。于是，<a href="http://imlazy.ycool.com/post.2059102.html#pic2"><font color=#005b7a>图 2</font></a> 被简化成了<a href="http://imlazy.ycool.com/post.2059102.html#pic3"><font color=#005b7a>图 3</font></a> 的样子。也就是说，最后一轮除外，每一轮被打开的猪圈和下一轮的同样这些猪圈都可以被合并成一个点。<br><br><a name=pic3></a></p>
<div align=center><img alt="" src="http://node1.foto.ycstatic.com/200805/27/1/26456801.jpg" border=0><br><br>图 3<br></div>
<p><br>&nbsp;&nbsp;&nbsp; 接着，根据<a href="http://imlazy.ycool.com/post.2059102.html#rule3"><font color=#005b7a>规律 3</font></a>，<a href="http://imlazy.ycool.com/post.2059102.html#pic3"><font color=#005b7a>图 3</font></a> 中的<font color=#000099>蓝色</font>节点、2 号猪圈和 1 号顾客这三点可以合并成一个；<a href="http://imlazy.ycool.com/post.2059102.html#pic3"><font color=#005b7a>图 3</font></a> 中的两个 3 号猪圈和 2 号顾客也可以合并成一个点。当然，如果两点之间有多条同向的边，则这些边可以合并成一条，容量相加，这个道理很简单，就不用我多说了。最终，上例中的网络模型被简化成了<a href="http://imlazy.ycool.com/post.2059102.html#pic4"><font color=#005b7a>图 4</font></a> 的样子。□<br><br><a name=pic4></a></p>
<div align=center><img alt="" src="http://node3.foto.ycstatic.com/200805/29/d/26464637.jpg" border=0></div>
<p><br>&nbsp;</p>
<div align=center>图 4<br></div>
<p><br>&nbsp;&nbsp;&nbsp; 让我们从<a href="http://imlazy.ycool.com/post.2059102.html#pic4"><font color=#005b7a>图 4</font></a> 中重新总结一下构造这个网络模型的规则：<br></p>
<ul>
    <li>每个顾客分别用一个节点来表示。
    <li>对于每个猪圈的第一个顾客，从源点向他连一条边，容量就是该猪圈里的猪的初始数量。如果从源点到一名顾客有多条边，则可以把它们合并成一条，容量相加。
    <li>对于每个猪圈，假设有 n 个顾客打开过它，则对所有整数 i &#8712; [1, n)，从该猪圈的第 i 个顾客向第 i + 1 个顾客连一条边，容量为 +&#8734;。
    <li>从各个顾客到汇点各有一条边，容量是各个顾客能买的数量上限。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 拿我们前面一直在讲的例子来说：1 号猪圈的第一个顾客是 1 号顾客，所以从源点到 1 号顾客有一条容量为 3 的边；1 号猪圈的第二个顾客是 2 号顾客，因此从 1 号顾客到 2 号顾客有一条容量为 +&#8734; 的边；2 号猪圈的第一个顾客也是 1 号顾客，所以从源点到 1 号顾客有一条容量为 1 的边，和之前已有的一条边合并起来，容量变成 4；2 号猪圈的第二个顾客是 3 号顾客，因此从 1 号顾客到 3 号顾客有一条容量为 +&#8734; 的边；3 号猪圈的第一个顾客是 2 号顾客，所以从源点到 2 号顾客有一条容量为 10 的边。□<br><br>&nbsp;&nbsp;&nbsp;<span style="COLOR: #800080"> 新的网络模型中最多只有 2 + N = 102 个节点，计算速度就可以相当快了。可以这样理解这个新的网络模型：对于某一个顾客，如果他打开了猪圈 h，则在他走后，他打开的所有猪圈里剩下的猪都有可能被换到 h 中，因而这些猪都有可能被 h 的下一个顾客买走。所以对于一个顾客打开的所有猪圈，从该顾客到各猪圈的下一个顾客，都要连一条容量为 +&#8734; 的边。<br></span><br>&nbsp;&nbsp;&nbsp; 在面对网络流问题时，如果一时想不出很好的构图方法，不如先构造一个最直观，或者说最&#8220;硬来&#8221;的模型，然后再用合并节点和边的方法来简直化这个模型。经过简化以后，好的构图思路自然就会涌现出来了。这是解决网络流问题的一个好方法。<br><br>&nbsp;&nbsp;&nbsp; <span style="COLOR: #800080"><strong style="COLOR: #008000">代码就不贴了，网络流的题目还是重在建模和思维转化。</strong></span><br></p>
<img src ="http://www.cppblog.com/acronix/aggbug/124108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-08-20 16:35 <a href="http://www.cppblog.com/acronix/archive/2010/08/20/124108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>容斥原理及代码</title><link>http://www.cppblog.com/acronix/archive/2010/08/19/123953.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Thu, 19 Aug 2010 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/08/19/123953.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/123953.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/08/19/123953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/123953.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/123953.html</trackback:ping><description><![CDATA[<p><span style="COLOR: #0000ff">下面是容斥原理的代码(主要用来计数)：f(i)是指具有性质i的个数</span></p>
<p><span style="COLOR: #008000; FONT-FAMILY: courier new"><strong>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Code：<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">n);i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">){<br>&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ccount&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;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">n;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">){<br>&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;test&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">j)</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">i);<br>&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(test</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;ccount</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br>&nbsp;}<br>&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(ccount</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;s&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;f(i);<br>&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">　　　　　　&nbsp;&nbsp;s&nbsp;</span><span style="COLOR: #000000">-=</span><span style="COLOR: #000000">&nbsp;f(i);<br>&nbsp;}</span></div>
<p></strong></span>&nbsp;</p>
<p><span style="COLOR: #008000">练习：</span></p>
<p><strong>PKU 2773</strong></p>
<p><strong>HDU 3507</strong></p>
<img src ="http://www.cppblog.com/acronix/aggbug/123953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-08-19 12:01 <a href="http://www.cppblog.com/acronix/archive/2010/08/19/123953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spfa算法对存在负环的dfs判断</title><link>http://www.cppblog.com/acronix/archive/2010/08/19/123952.html</link><dc:creator>acronix</dc:creator><author>acronix</author><pubDate>Thu, 19 Aug 2010 03:58:00 GMT</pubDate><guid>http://www.cppblog.com/acronix/archive/2010/08/19/123952.html</guid><wfw:comment>http://www.cppblog.com/acronix/comments/123952.html</wfw:comment><comments>http://www.cppblog.com/acronix/archive/2010/08/19/123952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/acronix/comments/commentRss/123952.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/acronix/services/trackbacks/123952.html</trackback:ping><description><![CDATA[<p><strong><span style="FONT-SIZE: 12pt; COLOR: #0000ff">spfa是使用队列进行渐近求最短路的方法</span>：</strong></p>
<p><span style="COLOR: #0000ff">思想为：</span></p>
<p>　　1、只保存被更新但未扩展的节点（即未进队的节点）</p>
<p>&nbsp;</p>
<p><span style="COLOR: #0000ff">做法：</span></p>
<p>　　&nbsp; 1、n建立一个队列，初始时队列里只有起始点，在建立一个表格记录起始点到所有点的最短路径（该表格的初始值要赋为极大值，该点到他本身的路径赋为0）。然后执行松弛操作，用队列里有的点去刷新起始点到所有点的最短路，如果刷新成功且被刷新点不在队列中则把该点加入到队列最后。重复执行直到队列为空 </p>
<div class=O>
<div>　　2、n期望的时间复杂度O(ke)， 其中k为所有顶点进队的平均次数，可以证明k一般小于等于2。 </div>
<div></div>
<div>使用队列的伪代码：</div>
<div>&nbsp;
<div class=O>
<div><span style="COLOR: #99cc00">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queue &lt;Node *&gt; Q; </span></div>
<div><span style="COLOR: #99cc00">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(!Q.empty()) Q.pop(); </span></div>
<div><span style="COLOR: #99cc00">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(visit , 0 , sizeof(visit)); </span></div>
<div><span style="COLOR: #99cc00">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i = 2;i &lt;= p; ++ i) dist[i] = inf; </span></div>
<div><span style="COLOR: #99cc00">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dist[1] = 0;&nbsp;</span></div>
<div><span style="COLOR: #99cc00">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Q.push(father[1]); </span></div>
<div><span style="COLOR: #99cc00">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visit[1] = true;</span></div>
<div></div>
<div>练练手：<strong><span style="TEXT-DECORATION: underline"><span style="COLOR: #3366ff">HDU 3499&nbsp;</span></span></strong></div>
<div><strong><span style="TEXT-DECORATION: underline"><span style="COLOR: #3366ff"><a href="http://acm.hdu.edu.cn/showproblem.php?pid=3499"><u><font color=#0000ff>http://acm.hdu.edu.cn/showproblem.php?pid=3499</font></u></a></span></span></strong></div>
<div><u><font color=#0000ff></font></u></div>
<div>用队列如何判断负环呢？当某个节点n次进入队列，则存在负环，此时时间复杂度为O(n*m),n为节点，m为边，</div>
<div>　　当n= 1000000 m=2000000是，那时间就相当可观了。</div>
<div>有什么更好的方法吗？有！深度优先搜索，得到一个更新的节点接扩展，</div>
<div>然后利用栈，当出现栈中的节点时，则存在负环。时间复杂度就基本保持在O(m)内；</div>
<div>&nbsp; 实战 WordRings(ACM-ICPC Centrual European 2005)</div>
<div>更多请看：<a href="http://www.docin.com/p-46740113.html"><u><font color=#0000ff>http://www.docin.com/p-46740113.html</font></u></a>#</div>
</div>
</div>
</div>
<img src ="http://www.cppblog.com/acronix/aggbug/123952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/acronix/" target="_blank">acronix</a> 2010-08-19 11:58 <a href="http://www.cppblog.com/acronix/archive/2010/08/19/123952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>