<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Beyond the Void &#187; 图论</title>
	<atom:link href="http://www.byvoid.com/blog/tag/%e5%9b%be%e8%ae%ba/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.byvoid.com/blog</link>
	<description></description>
	<lastBuildDate>Tue, 29 Jun 2010 08:44:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>有向图强连通分量的Tarjan算法</title>
		<link>http://www.byvoid.com/blog/scc-tarjan/</link>
		<comments>http://www.byvoid.com/blog/scc-tarjan/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 23:56:51 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[計算機科學]]></category>
		<category><![CDATA[Tarjan]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[堆栈]]></category>
		<category><![CDATA[强连通分量]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=1235</guid>
		<description><![CDATA[[有向图强连通分量] 在有向图G中，如果两个顶点间至少存在一条路径，称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通，称G是一个强连通图。非强连通图有向图的极大强... ]]></description>
			<content:encoded><![CDATA[<h3><strong>[有向图强连通分量]</strong></h3>
<p>在有向图G中，如果两个顶点间至少存在一条路径，称两个顶点<strong>强连通</strong>(strongly connected)。如果有向图G的每两个顶点都强连通，称G是一个<strong>强连通图</strong>。非强连通图有向图的极大强连通子图，称为<strong>强连通分量</strong>(strongly connected components)。</p>
<p>下图中，子图{1,2,3,4}为一个强连通分量，因为顶点1,2,3,4两两可达。{5},{6}也分别是两个强连通分量。</p>
<p><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image1.png" border="0" alt="image" width="320" height="201" /></p>
<p>直接根据定义，用双向遍历取交集的方法求强连通分量，时间复杂度为O(N^2+M)。更好的方法是Kosaraju算法或Tarjan算法，两者的时间复杂度都是O(N+M)。本文介绍的是Tarjan算法。</p>
<h3><strong>[Tarjan算法]</strong></h3>
<p>Tarjan算法是基于对图深度优先搜索的算法，<span style="text-decoration: underline;">每个强连通分量为搜索树中的一棵子树</span>。搜索时，把当前搜索树中未处理的节点加入一个堆栈，回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。</p>
<p>定义DFN(u)为节点u搜索的次序编号(时间戳)，Low(u)为u或u的子树能够追溯到的最早的栈中节点的次序号。由定义可以得出，</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1235code4'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12354"><td class="code" id="p1235code4"><pre class="cpp" style="font-family:monospace;">Low<span style="color: #008000;">&#40;</span>u<span style="color: #008000;">&#41;</span><span style="color: #000080;">=</span>Min
<span style="color: #008000;">&#123;</span>
    DFN<span style="color: #008000;">&#40;</span>u<span style="color: #008000;">&#41;</span>,
    Low<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span>,<span style="color: #008000;">&#40;</span>u,v<span style="color: #008000;">&#41;</span>为树枝边，u为v的父节点
    DFN<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span>,<span style="color: #008000;">&#40;</span>u,v<span style="color: #008000;">&#41;</span>为指向栈中节点的后向边<span style="color: #008000;">&#40;</span>非横叉边<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><span style="text-decoration: underline;">当DFN(u)=Low(u)时，以u为根的搜索子树上所有节点是一个强连通分量。</span></p>
<p>算法伪代码如下</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1235code5'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12355"><td class="code" id="p1235code5"><pre class="cpp" style="font-family:monospace;">tarjan<span style="color: #008000;">&#40;</span>u<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	DFN<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>Low<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">++</span>Index                      <span style="color: #666666;">// 为节点u设定次序编号和Low初值</span>
	Stack.<span style="color: #007788;">push</span><span style="color: #008000;">&#40;</span>u<span style="color: #008000;">&#41;</span>                              <span style="color: #666666;">// 将节点u压入栈中</span>
	<span style="color: #0000ff;">for</span> each <span style="color: #008000;">&#40;</span>u, v<span style="color: #008000;">&#41;</span> in E                       <span style="color: #666666;">// 枚举每一条边</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>v is not visted<span style="color: #008000;">&#41;</span>               <span style="color: #666666;">// 如果节点v未被访问过</span>
			tarjan<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span>                  <span style="color: #666666;">// 继续向下找</span>
			Low<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> min<span style="color: #008000;">&#40;</span>Low<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span>, Low<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>v in S<span style="color: #008000;">&#41;</span>                   <span style="color: #666666;">// 如果节点v还在栈内</span>
			Low<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> min<span style="color: #008000;">&#40;</span>Low<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span>, DFN<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>DFN<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span> <span style="color: #000080;">==</span> Low<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>                      <span style="color: #666666;">// 如果节点u是强连通分量的根</span>
		repeat
			v <span style="color: #000080;">=</span> S.<span style="color: #007788;">pop</span>                  <span style="color: #666666;">// 将v退栈，为该强连通分量中一个顶点</span>
			print v
		until <span style="color: #008000;">&#40;</span>u<span style="color: #000080;">==</span> v<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>接下来是对算法流程的演示。</p>
<p>从节点1开始DFS，把遍历到的节点加入栈中。搜索到节点u=6时，DFN[6]=LOW[6]，找到了一个强连通分量。退栈到u=v为止，{6}为一个强连通分量。</p>
<p><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image2.png" border="0" alt="image" width="523" height="305" /></p>
<p>返回节点5，发现DFN[5]=LOW[5]，退栈后{5}为一个强连通分量。</p>
<p><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image3.png" border="0" alt="image" width="523" height="335" /></p>
<p>返回节点3，继续搜索到节点4，把4加入堆栈。发现节点4向节点1有后向边，节点1还在栈中，所以LOW[4]=1。节点6已经出栈，(4,6)是横叉边，返回3，(3,4)为树枝边，所以LOW[3]=LOW[4]=1。</p>
<p><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image4.png" border="0" alt="image" width="523" height="335" /></p>
<p>继续回到节点1，最后访问节点2。访问边(2,4)，4还在栈中，所以LOW[2]=DFN[4]=5。返回1后，发现DFN[1]=LOW[1]，把栈中节点全部取出，组成一个连通分量{1,3,4,2}。</p>
<p><img style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" title="image" src="http://www.byvoid.com/blog/wp-content/uploads/2009/04/image5.png" border="0" alt="image" width="523" height="335" /></p>
<p>至此，算法结束。经过该算法，求出了图中全部的三个强连通分量{1,3,4,2},{5},{6}。</p>
<p>可以发现，运行Tarjan算法的过程中，每个顶点都被访问了一次，且只进出了一次堆栈，每条边也只被访问了一次，所以该算法的时间复杂度为O(N+M)。</p>
<p>求有向图的强连通分量还有一个强有力的算法，为Kosaraju算法。Kosaraju是基于对有向图及其逆图两次DFS的方法，其时间复杂度也是O(N+M)。与Trajan算法相比，Kosaraju算法可能会稍微更直观一些。但是Tarjan只用对原图进行一次DFS，不用建立逆图，更简洁。在实际的测试中，Tarjan算法的运行效率也比Kosaraju算法高30%左右。此外，该Tarjan算法与<a href="http://www.byvoid.com/blog/biconnect/" target="_blank">求无向图的双连通分量(割点、桥)的Tarjan算法</a>也有着很深的联系。学习该Tarjan算法，也有助于深入理解求双连通分量的Tarjan算法，两者可以类比、组合理解。</p>
<p>求有向图的强连通分量的Tarjan算法是以其发明者<a href="http://en.wikipedia.org/wiki/Robert_Tarjan" target="_blank">Robert Tarjan</a>命名的。Robert Tarjan还发明了求<a href="http://www.byvoid.com/blog/biconnect/" target="_blank">双连通分量</a>的Tarjan算法，以及求最近公共祖先的离线Tarjan算法，在此对Tarjan表示崇高的敬意。</p>
<p>附：tarjan算法的C++程序</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p1235code6'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12356"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code" id="p1235code6"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">void</span> tarjan<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> j<span style="color: #008080;">;</span>
	DFN<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>LOW<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">++</span>Dindex<span style="color: #008080;">;</span>
	instack<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
	Stap<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>Stop<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>edge <span style="color: #000040;">*</span>e<span style="color: #000080;">=</span>V<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>e<span style="color: #008080;">;</span>e<span style="color: #000080;">=</span>e<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		j<span style="color: #000080;">=</span>e<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>t<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>DFN<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			tarjan<span style="color: #008000;">&#40;</span>j<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>LOW<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;</span>LOW<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
				LOW<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>LOW<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>instack<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> DFN<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">&lt;</span>LOW<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			LOW<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>DFN<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>DFN<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>LOW<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		Bcnt<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">do</span>
		<span style="color: #008000;">&#123;</span>
			j<span style="color: #000080;">=</span>Stap<span style="color: #008000;">&#91;</span>Stop<span style="color: #000040;">--</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			instack<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			Belong<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>Bcnt<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000040;">!</span><span style="color: #000080;">=</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
	Stop<span style="color: #000080;">=</span>Bcnt<span style="color: #000080;">=</span>Dindex<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>DFN,<span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>DFN<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>DFN<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			tarjan<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>[参考资料]</strong></p>
<ul>
<li><a title="http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm" href="http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm" target="_blank">Wikipedia</a></li>
<li><a href="http://adn.cn" target="_blank">Amber</a>的图论总结</li>
</ul>
<p><em><a href="http://www.byvoid.com/">BYVoid</a> 原创作品，转载请注明。</em></p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/biconnect/" title="图的割点、桥与双连通分支">图的割点、桥与双连通分支</a></li><li><a href="http://www.byvoid.com/blog/noi-1997-solution/" title="NOI 1997 解题报告">NOI 1997 解题报告</a></li><li><a href="http://www.byvoid.com/blog/poi-2001-pch/" title="POI 2001 Wandering flea trainers 跳舞蝇的教练">POI 2001 Wandering flea trainers 跳舞蝇的教练</a></li><li><a href="http://www.byvoid.com/blog/directed-tree-bracket-sequence/" title="有向树与树的括号序列最小表示法">有向树与树的括号序列最小表示法</a></li><li><a href="http://www.byvoid.com/blog/poi-1998-gon/" title="POI 1998 追赶 Chase">POI 1998 追赶 Chase</a></li><li><a href="http://www.byvoid.com/blog/usaco-mar07-silver-cow-traffic/" title="USACO MAR07 Silver Cow Traffic 奶牛交通">USACO MAR07 Silver Cow Traffic 奶牛交通</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/scc-tarjan/feed/</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>NOI 1997 解题报告</title>
		<link>http://www.byvoid.com/blog/noi-1997-solution/</link>
		<comments>http://www.byvoid.com/blog/noi-1997-solution/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 13:33:58 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[NOI]]></category>
		<category><![CDATA[1997]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[剪枝]]></category>
		<category><![CDATA[动态规划]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[搜索]]></category>
		<category><![CDATA[最短路径]]></category>
		<category><![CDATA[正则表达式]]></category>
		<category><![CDATA[离散化]]></category>
		<category><![CDATA[立体切割]]></category>
		<category><![CDATA[解题报告]]></category>
		<category><![CDATA[计算几何]]></category>
		<category><![CDATA[递归]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=866</guid>
		<description><![CDATA[我的计划就从NOI1997开始。NOI1997一共有6道题，分别是[卫星覆盖][积木游戏][竞赛排名][最佳游览][最优乘车][文件匹配]。这一年的6个题难易分布均衡，做完后收获不小。 其中[竞赛排名]和[最佳游... ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.byvoid.com/blog/noi-plan/">我的计划</a>就从NOI1997开始。<strong>NOI1997</strong>一共有6道题，分别是[卫星覆盖][积木游戏][竞赛排名][最佳游览][最优乘车][文件匹配]。这一年的6个题难易分布均衡，做完后收获不小。</p>
<p>其中[竞赛排名]和[最佳游览]是两个最简单的题，但是往往细节是容易忽视的。[积木游戏]和[最优乘车]难度属于中等，分别是动态规划和构造最短路径解题。[卫星覆盖]和[文件匹配]属于较难题，用到了[卫星覆盖]离散化或者立体切割的方法，而[文件匹配]是搜索中的难题，需要很多的优化。</p>
<p>做这些题我花了4天的时间，进度还算正常，希望能继续保持下去。今后做题的宗旨是“不求多，不求快，但求精”。</p>
<p><span id="more-866"></span></p>
<p><strong>[最佳游览]</strong></p>
<p>这是一道非常简单的题，读懂题后，发现方法就是统计出每一列的最大值，存为一个数列A。求A的连续最大子序列即可。</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p866code15'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86615"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
</pre></td><td class="code" id="p866code15"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI1997 perfecttour
 * Author: Guo Jiabao
 * Time: 2009.2.14 14:01
 * State: Solved
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">20001</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> M,N,i,j,t,T,Ans<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> A<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;perfecttour.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;perfecttour.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d&quot;</span>,<span style="color: #000040;">&amp;</span>M,<span style="color: #000040;">&amp;</span>N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	N<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		A<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>t<span style="color: #000080;">&gt;</span>A<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
				A<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>t<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span>,T<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		T<span style="color: #000040;">+</span><span style="color: #000080;">=</span>A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>T<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
			T<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>T<span style="color: #000080;">&gt;</span>Ans<span style="color: #008000;">&#41;</span>
			Ans<span style="color: #000080;">=</span>T<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%dn&quot;</span>,Ans<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>[竞赛排名]</strong></p>
<p>这也是一道送分题，数据很小方法很明确，就是排序。关键在于看清式子，注意关系算出各个量后直接排序就行了。</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p866code16'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86616"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
</pre></td><td class="code" id="p866code16"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI1997 competitionsort
 * Author: Guo Jiabao
 * Time: 2009.2.13 14:09
 * State: Solved
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
&nbsp;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">1001</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> sum<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,S<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">double</span> avg<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #008000;">&#93;</span>,pos<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,y<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">9</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> inf<span style="color: #008000;">&#123;</span><span style="color: #0000ff;">int</span> id,sum<span style="color: #008080;">;</span><span style="color: #0000ff;">double</span> pos<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span> P<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N<span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;competitionsort.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;competitionsort.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span><span style="color: #0000dd;">8</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">double</span> ABS<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">double</span> A<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> A<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">0</span><span style="color: #008080;">?</span><span style="color: #000040;">-</span>A<span style="color: #008080;">:</span>A<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">int</span> cmp<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>a,<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>b<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>a<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>pos <span style="color: #000080;">&gt;</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>b<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>pos<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>a<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>pos <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>b<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>pos<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>a<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sum <span style="color: #000080;">&gt;</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>b<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sum<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>a<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sum <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>b<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>sum<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>a<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>id <span style="color: #000080;">&lt;</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>inf <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>b<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>id<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> statistics<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">double</span> m<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">8</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span><span style="color: #0000dd;">8</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			avg<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span>S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			sum<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span>S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		avg<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">/</span><span style="color: #000080;">=</span>N<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span><span style="color: #0000dd;">8</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		m<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			m<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span>ABS<span style="color: #008000;">&#40;</span>S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>avg<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		m<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">/</span><span style="color: #000080;">=</span>N<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span><span style="color: #0000dd;">8</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>m<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
				y<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">else</span>
				y<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span>avg<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">/</span>m<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span><span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			pos<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span>y<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">4</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span><span style="color: #0000dd;">8</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			pos<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span>y<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000040;">*</span><span style="color:#800080;">0.8</span><span style="color: #008080;">;</span>
		P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">pos</span><span style="color: #000080;">=</span>pos<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">sum</span><span style="color: #000080;">=</span>sum<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">id</span><span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000dd;">qsort</span><span style="color: #008000;">&#40;</span>P<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>,N,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>P<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>,cmp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%dn&quot;</span>,P<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">id</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	statistics<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>[积木游戏]</strong></p>
<p>由于把积木分成M堆，每堆中积木的编号都是严格划分的，可以看作把积木按编号顺序划分为M份。可以动态规划，状态转移时只需考虑第i个放置相邻两对的决策。</p>
<p>设定F[i,j,k]表示放置第i个积木时，把它放在第j堆，用第k种方式放置的总最大高度。</p>
<p>第k种放置方式(0&lt;=k&lt;=2)，分别表示了用积木的哪一面作为底。</p>
<p>状态转移方程</p>
<ul>
<li>F[i,j,k]=Max{ F[a,j,b]|(i,k)能放置在(a,b)上 ,F[a,j-1,b] (0&lt;=a&lt;=i-1,0&lt;=b&lt;=2) } + height(i,k)</li>
</ul>
<ul>
<li>height(i,k)为第i个积木以方式k放置的高。</li>
</ul>
<p>初始条件为</p>
<ul>
<li>F[i,j,k]=负无穷大;(0&lt;=i&lt;=N,0&lt;=j&lt;=M,0&lt;=k&lt;=2)</li>
<li>F[0,0,0]=0;</li>
</ul>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p866code17'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86617"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
</pre></td><td class="code" id="p866code17"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI1997 buildinggame
 * Author: Guo Jiabao
 * Time: 2009.2.12 13:53
 * State: Solved
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAX<span style="color: #000080;">=</span><span style="color: #0000dd;">101</span>,INF<span style="color: #000080;">=</span><span style="color: #208080;">0x7FFFFFFF</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> block<span style="color: #008000;">&#123;</span><span style="color: #0000ff;">int</span> a,b,c<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>B<span style="color: #008000;">&#91;</span>MAX<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> F<span style="color: #008000;">&#91;</span>MAX<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAX<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">3</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N,M,Ans<span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,k<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;buildinggame.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;buildinggame.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d&quot;</span>,<span style="color: #000040;">&amp;</span>N,<span style="color: #000040;">&amp;</span>M<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d%d&quot;</span>,<span style="color: #000040;">&amp;</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">a</span>,<span style="color: #000040;">&amp;</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">b</span>,<span style="color: #000040;">&amp;</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">c</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
				F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span>INF<span style="color: #008080;">;</span>
	F<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> block roll<span style="color: #008000;">&#40;</span>block A,<span style="color: #0000ff;">int</span> k<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">==</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>t<span style="color: #000080;">=</span>A.<span style="color: #007788;">b</span><span style="color: #008080;">;</span>A.<span style="color: #007788;">b</span><span style="color: #000080;">=</span>A.<span style="color: #007788;">c</span><span style="color: #008080;">;</span>A.<span style="color: #007788;">c</span><span style="color: #000080;">=</span>t<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">==</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>t<span style="color: #000080;">=</span>A.<span style="color: #007788;">a</span><span style="color: #008080;">;</span>A.<span style="color: #007788;">a</span><span style="color: #000080;">=</span>A.<span style="color: #007788;">b</span><span style="color: #008080;">;</span>A.<span style="color: #007788;">b</span><span style="color: #000080;">=</span>A.<span style="color: #007788;">c</span><span style="color: #008080;">;</span>A.<span style="color: #007788;">c</span><span style="color: #000080;">=</span>t<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> A<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">bool</span> available<span style="color: #008000;">&#40;</span>block A,<span style="color: #0000ff;">int</span> k1,block B,<span style="color: #0000ff;">int</span> k2<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	A<span style="color: #000080;">=</span>roll<span style="color: #008000;">&#40;</span>A,k1<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>B<span style="color: #000080;">=</span>roll<span style="color: #008000;">&#40;</span>B,k2<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>B.<span style="color: #007788;">a</span><span style="color: #000080;">&gt;=</span>A.<span style="color: #007788;">a</span> <span style="color: #000040;">&amp;&amp;</span> B.<span style="color: #007788;">b</span><span style="color: #000080;">&gt;=</span>A.<span style="color: #007788;">b</span><span style="color: #008000;">&#41;</span> <span style="color: #000040;">||</span> <span style="color: #008000;">&#40;</span>B.<span style="color: #007788;">a</span><span style="color: #000080;">&gt;=</span>A.<span style="color: #007788;">b</span> <span style="color: #000040;">&amp;&amp;</span> B.<span style="color: #007788;">b</span><span style="color: #000080;">&gt;=</span>A.<span style="color: #007788;">a</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> dynamic<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,k,a,b<span style="color: #008080;">;</span>
	block T<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>a<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>a<span style="color: #000080;">&lt;</span>i<span style="color: #008080;">;</span>a<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
					<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>b<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>b<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">3</span><span style="color: #008080;">;</span>b<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
					<span style="color: #008000;">&#123;</span>
						<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>available<span style="color: #008000;">&#40;</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,k,B<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>,b<span style="color: #008000;">&#41;</span> <span style="color: #000040;">&amp;&amp;</span> F<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>b<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
							F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> F<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>b<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
						<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span> F<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>b<span style="color: #008000;">&#93;</span> <span style="color: #000080;">&gt;</span> F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#41;</span>
							F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> F<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>b<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
					<span style="color: #008000;">&#125;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span><span style="color: #000080;">=</span> <span style="color: #008000;">&#40;</span>T<span style="color: #000080;">=</span>roll<span style="color: #008000;">&#40;</span>B<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,k<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>.<span style="color: #007788;">c</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;</span>Ans<span style="color: #008000;">&#41;</span>
					Ans<span style="color: #000080;">=</span>F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	dynamic<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%dn&quot;</span>,Ans<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>[最优乘车]</strong></p>
<p>可以构造最短路径求解。对于不同线路上的相同编号的车站，应该看作不同的顶点，而且这两个点之间互相连接一条边权为1的有向边。同一条线路上的所有 车站，按照顺序连接边权为0的有向边。为了方便，我们增设一个超级源S和超级汇T。S向所有代表车站1的顶点连接一条边权为0的有向边，所有代表车站N的 顶点向T连接一条边权为0的有向边。</p>
<p>图构造好以后，只需求从S到T的最短路径即可。建议用SPFA，在这种特殊的01图上，SPFA会比Dijkstra(堆)快得多。</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p866code18'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86618"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
</pre></td><td class="code" id="p866code18"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI1997 bustravel
 * Author: Guo Jiabao
 * Time: 2009.2.14 19:10
 * State: Solved
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXM<span style="color: #000080;">=</span><span style="color: #0000dd;">101</span>,MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">501</span>,INF<span style="color: #000080;">=</span><span style="color: #208080;">0x7FFFFFF</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> edge<span style="color: #008000;">&#123;</span>edge <span style="color: #000040;">*</span>next<span style="color: #008080;">;</span><span style="color: #0000ff;">int</span> t,v<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> adjl<span style="color: #008000;">&#123;</span>edge <span style="color: #000040;">*</span>f,<span style="color: #000040;">*</span>l<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> M,N,Total,Target,EC<span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span>,Queue_cnt,Queue_head,Queue_tail<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> BusLine<span style="color: #008000;">&#91;</span>MAXM<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//第i行第j个点的原始编号</span>
<span style="color: #0000ff;">int</span> BusHash<span style="color: #008000;">&#91;</span>MAXM<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//第i行原始编号为j的点正式编号</span>
<span style="color: #0000ff;">int</span> sp<span style="color: #008000;">&#91;</span>MAXM<span style="color: #000040;">*</span>MAXN<span style="color: #008000;">&#93;</span>,Queue<span style="color: #008000;">&#91;</span>MAXM<span style="color: #000040;">*</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> inQueue<span style="color: #008000;">&#91;</span>MAXM<span style="color: #000040;">*</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
edge ES<span style="color: #008000;">&#91;</span>MAXM<span style="color: #000040;">*</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
adjl Adjl<span style="color: #008000;">&#91;</span>MAXM<span style="color: #000040;">*</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,k,c<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;bustravel.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;bustravel.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d&quot;</span>,<span style="color: #000040;">&amp;</span>M,<span style="color: #000040;">&amp;</span>N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">do</span> c<span style="color: #000080;">=</span><span style="color: #0000dd;">getchar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #0000ff;">while</span><span style="color: #008000;">&#40;</span>c<span style="color: #000080;">==</span><span style="color: #0000dd;">10</span> <span style="color: #000040;">||</span> c<span style="color: #000080;">==</span><span style="color: #0000dd;">13</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span><span style="color: #008000;">&#40;</span>c<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">10</span> <span style="color: #000040;">&amp;&amp;</span> c<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000dd;">13</span> <span style="color: #000040;">&amp;&amp;</span> c<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000ff;">EOF</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000dd;">ungetc</span><span style="color: #008000;">&#40;</span>c,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>k<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>k<span style="color: #008080;">;</span>
			BusHash<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">++</span>Total<span style="color: #008080;">;</span>
			c<span style="color: #000080;">=</span><span style="color: #0000dd;">getchar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>j<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	Target<span style="color: #000080;">=</span><span style="color: #000040;">++</span>Total<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> addedge<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b,<span style="color: #0000ff;">int</span> v<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	edge <span style="color: #000040;">*</span>p<span style="color: #000080;">=</span><span style="color: #000040;">&amp;</span>ES<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>EC<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Adjl<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">l</span><span style="color: #008000;">&#41;</span>
		Adjl<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">l</span><span style="color: #000080;">=</span>Adjl<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">l</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #000080;">=</span>p<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
		Adjl<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">f</span><span style="color: #000080;">=</span>Adjl<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">l</span><span style="color: #000080;">=</span>p<span style="color: #008080;">;</span>
	p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>t<span style="color: #000080;">=</span>b<span style="color: #008080;">;</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>v<span style="color: #000080;">=</span>v<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> makegraph<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,k,p,a,b<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			a<span style="color: #000080;">=</span>BusHash<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span> BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span>   <span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			b<span style="color: #000080;">=</span>BusHash<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span> BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			addedge<span style="color: #008000;">&#40;</span>a,b,<span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
				addedge<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>,a,<span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>N<span style="color: #008000;">&#41;</span>
				addedge<span style="color: #008000;">&#40;</span>a,Target,<span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
			addedge<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span>,b,<span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>N<span style="color: #008000;">&#41;</span>
			addedge<span style="color: #008000;">&#40;</span>b,Target,<span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>M<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			p<span style="color: #000080;">=</span>BusLine<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			a<span style="color: #000080;">=</span>BusHash<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;=</span>M<span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				b<span style="color: #000080;">=</span>BusHash<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span>
				<span style="color: #008000;">&#123;</span>
					addedge<span style="color: #008000;">&#40;</span>a,b,<span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
					addedge<span style="color: #008000;">&#40;</span>b,a,<span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
				<span style="color: #008000;">&#125;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> Queue_ins<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> p<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>Queue_head<span style="color: #000080;">==</span>MAXM<span style="color: #000040;">*</span>MAXN<span style="color: #008000;">&#41;</span> Queue_head<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	Queue<span style="color: #008000;">&#91;</span>Queue_head<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>p<span style="color: #008080;">;</span>
	inQueue<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
	Queue_cnt<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> Queue_pop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> p<span style="color: #000080;">=</span>Queue<span style="color: #008000;">&#91;</span>Queue_tail<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">++</span>Queue_tail<span style="color: #000080;">==</span>MAXM<span style="color: #000040;">*</span>MAXN<span style="color: #008000;">&#41;</span> Queue_tail<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	inQueue<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	Queue_cnt<span style="color: #000040;">--</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> p<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> spfa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,u,v<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>Total<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		sp<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>INF<span style="color: #008080;">;</span>
	Queue_head<span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>Queue_tail<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	Queue_ins<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>Queue_cnt<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		u<span style="color: #000080;">=</span>Queue_pop<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>edge <span style="color: #000040;">*</span>k<span style="color: #000080;">=</span>Adjl<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">f</span><span style="color: #008080;">;</span>k<span style="color: #008080;">;</span>k<span style="color: #000080;">=</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			v<span style="color: #000080;">=</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>t<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>sp<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>v <span style="color: #000080;">&lt;</span> sp<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #008000;">&#123;</span>
				sp<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>sp<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span> <span style="color: #000040;">+</span> k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>v<span style="color: #008080;">;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>inQueue<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
					Queue_ins<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #008000;">&#125;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	makegraph<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	spfa<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>sp<span style="color: #008000;">&#91;</span>Target<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>INF<span style="color: #008000;">&#41;</span>
		<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;NOn&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
		<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%dn&quot;</span>,sp<span style="color: #008000;">&#91;</span>Target<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>[卫星覆盖]</strong></p>
<p>经典的分治问题，方法为立方体切割。和USACO中的<a href="http://www.byvoid.com/blog/usaco-314-shaping-regions/">Shaping Regions</a>的做法相似，只不过是从二维推广到了三维。</p>
<p>具体方法是，对于第i个立方体，判断大于i的每个立方体是否与之有公共部分，如果有公共部分，把该长方体非公共部分切割成几个规则的长方体，然后递归处理每一个长方体。直到没有公共部分了，体积就是长*宽*高。</p>
<p>对于两个矩形（每条边都平行于坐标轴），我们判断它们相交，有一种简单的方法。两个矩形A和B，定义(A.x1,A.y1)为A的左下角顶 点，(A.x2,A.y2)为A的右上角顶点，同理B，只要满足 A.x1 &lt; B.x2 且 A.y1 &lt; B.y2 且 B.x1 &lt; A.x2 且 B.y1 &lt; A.y2，则A、B一定相交。</p>
<p>相似地，对于两个长方体A、B，只要满足</p>
<pre>A.x1 &lt; B.x2 &amp;&amp; A.y1 &lt; B.y2 &amp;&amp; A.z1 &lt; B.z2 &amp;&amp; B.x1 &lt; A.x2 &amp;&amp; B.y1 &lt; A.y2 &amp;&amp; B.z1 &lt; A.z2</pre>
<p>则A、B相交。</p>
<p>上述方法的时间复杂度是O(N^3)，是很宽松的。</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p866code19'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86619"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
</pre></td><td class="code" id="p866code19"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI1997 satellitecover
 * Author: Guo Jiabao
 * Time: 2009.2.11 21:17
 * State: Solved
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">201</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> cube<span style="color: #008000;">&#123;</span><span style="color: #0000ff;">int</span> x1,y1,z1,x2,y2,z2<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N<span style="color: #008080;">;</span>
cube Cubes<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,a,b,c,r<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;satellitecover.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;satellitecover.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d%d%d%d&quot;</span>,<span style="color: #000040;">&amp;</span>a,<span style="color: #000040;">&amp;</span>b,<span style="color: #000040;">&amp;</span>c,<span style="color: #000040;">&amp;</span>r<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		Cubes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">x1</span><span style="color: #000080;">=</span>a<span style="color: #000040;">-</span>r<span style="color: #008080;">;</span> Cubes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">y1</span><span style="color: #000080;">=</span>b<span style="color: #000040;">-</span>r<span style="color: #008080;">;</span> Cubes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">z1</span><span style="color: #000080;">=</span>c<span style="color: #000040;">-</span>r<span style="color: #008080;">;</span>
		Cubes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">x2</span><span style="color: #000080;">=</span>a<span style="color: #000040;">+</span>r<span style="color: #008080;">;</span> Cubes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">y2</span><span style="color: #000080;">=</span>b<span style="color: #000040;">+</span>r<span style="color: #008080;">;</span> Cubes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">z2</span><span style="color: #000080;">=</span>c<span style="color: #000040;">+</span>r<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">bool</span> cross<span style="color: #008000;">&#40;</span>cube A,cube B<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span> A.<span style="color: #007788;">x1</span> <span style="color: #000080;">&lt;</span> B.<span style="color: #007788;">x2</span> <span style="color: #000040;">&amp;&amp;</span> A.<span style="color: #007788;">y1</span> <span style="color: #000080;">&lt;</span> B.<span style="color: #007788;">y2</span> <span style="color: #000040;">&amp;&amp;</span> A.<span style="color: #007788;">z1</span> <span style="color: #000080;">&lt;</span> B.<span style="color: #007788;">z2</span> <span style="color: #000040;">&amp;&amp;</span> B.<span style="color: #007788;">x1</span> <span style="color: #000080;">&lt;</span> A.<span style="color: #007788;">x2</span> <span style="color: #000040;">&amp;&amp;</span> B.<span style="color: #007788;">y1</span> <span style="color: #000080;">&lt;</span> A.<span style="color: #007788;">y2</span> <span style="color: #000040;">&amp;&amp;</span> B.<span style="color: #007788;">z1</span> <span style="color: #000080;">&lt;</span> A.<span style="color: #007788;">z2</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
cube mcube<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x1,<span style="color: #0000ff;">int</span> y1,<span style="color: #0000ff;">int</span> z1,<span style="color: #0000ff;">int</span> x2,<span style="color: #0000ff;">int</span> y2,<span style="color: #0000ff;">int</span> z2<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	cube A<span style="color: #008080;">;</span>
	A.<span style="color: #007788;">x1</span><span style="color: #000080;">=</span>x1<span style="color: #008080;">;</span>A.<span style="color: #007788;">y1</span><span style="color: #000080;">=</span>y1<span style="color: #008080;">;</span>A.<span style="color: #007788;">z1</span><span style="color: #000080;">=</span>z1<span style="color: #008080;">;</span>A.<span style="color: #007788;">x2</span><span style="color: #000080;">=</span>x2<span style="color: #008080;">;</span>A.<span style="color: #007788;">y2</span><span style="color: #000080;">=</span>y2<span style="color: #008080;">;</span>A.<span style="color: #007788;">z2</span><span style="color: #000080;">=</span>z2<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> A<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> devide<span style="color: #008000;">&#40;</span>cube A,<span style="color: #0000ff;">int</span> pos<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	cube B<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> volume<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>pos<span style="color: #000080;">&lt;=</span>N <span style="color: #000040;">&amp;&amp;</span> <span style="color: #000040;">!</span>cross<span style="color: #008000;">&#40;</span>A,B<span style="color: #000080;">=</span>Cubes<span style="color: #008000;">&#91;</span>pos<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> pos<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pos<span style="color: #000080;">&gt;</span>N<span style="color: #008000;">&#41;</span>
		volume<span style="color: #000080;">=</span><span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">x2</span><span style="color: #000040;">-</span>A.<span style="color: #007788;">x1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">y2</span><span style="color: #000040;">-</span>A.<span style="color: #007788;">y1</span><span style="color: #008000;">&#41;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">z2</span><span style="color: #000040;">-</span>A.<span style="color: #007788;">z1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">x1</span> <span style="color: #000080;">&lt;</span> B.<span style="color: #007788;">x1</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			volume<span style="color: #000040;">+</span><span style="color: #000080;">=</span>devide<span style="color: #008000;">&#40;</span>mcube<span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">x1</span>,A.<span style="color: #007788;">y1</span>,A.<span style="color: #007788;">z1</span>,B.<span style="color: #007788;">x1</span>,A.<span style="color: #007788;">y2</span>,A.<span style="color: #007788;">z2</span><span style="color: #008000;">&#41;</span>,pos<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			A.<span style="color: #007788;">x1</span><span style="color: #000080;">=</span>B.<span style="color: #007788;">x1</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">x2</span> <span style="color: #000080;">&gt;</span> B.<span style="color: #007788;">x2</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			volume<span style="color: #000040;">+</span><span style="color: #000080;">=</span>devide<span style="color: #008000;">&#40;</span>mcube<span style="color: #008000;">&#40;</span>B.<span style="color: #007788;">x2</span>,A.<span style="color: #007788;">y1</span>,A.<span style="color: #007788;">z1</span>,A.<span style="color: #007788;">x2</span>,A.<span style="color: #007788;">y2</span>,A.<span style="color: #007788;">z2</span><span style="color: #008000;">&#41;</span>,pos<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			A.<span style="color: #007788;">x2</span><span style="color: #000080;">=</span>B.<span style="color: #007788;">x2</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">y1</span> <span style="color: #000080;">&lt;</span> B.<span style="color: #007788;">y1</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			volume<span style="color: #000040;">+</span><span style="color: #000080;">=</span>devide<span style="color: #008000;">&#40;</span>mcube<span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">x1</span>,A.<span style="color: #007788;">y1</span>,A.<span style="color: #007788;">z1</span>,A.<span style="color: #007788;">x2</span>,B.<span style="color: #007788;">y1</span>,A.<span style="color: #007788;">z2</span><span style="color: #008000;">&#41;</span>,pos<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			A.<span style="color: #007788;">y1</span><span style="color: #000080;">=</span>B.<span style="color: #007788;">y1</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">y2</span> <span style="color: #000080;">&gt;</span> B.<span style="color: #007788;">y2</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			volume<span style="color: #000040;">+</span><span style="color: #000080;">=</span>devide<span style="color: #008000;">&#40;</span>mcube<span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">x1</span>,B.<span style="color: #007788;">y2</span>,A.<span style="color: #007788;">z1</span>,A.<span style="color: #007788;">x2</span>,A.<span style="color: #007788;">y2</span>,A.<span style="color: #007788;">z2</span><span style="color: #008000;">&#41;</span>,pos<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			A.<span style="color: #007788;">y2</span><span style="color: #000080;">=</span>B.<span style="color: #007788;">y2</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">z1</span> <span style="color: #000080;">&lt;</span> B.<span style="color: #007788;">z1</span><span style="color: #008000;">&#41;</span>
			volume<span style="color: #000040;">+</span><span style="color: #000080;">=</span>devide<span style="color: #008000;">&#40;</span>mcube<span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">x1</span>,A.<span style="color: #007788;">y1</span>,A.<span style="color: #007788;">z1</span>,A.<span style="color: #007788;">x2</span>,A.<span style="color: #007788;">y2</span>,B.<span style="color: #007788;">z1</span><span style="color: #008000;">&#41;</span>,pos<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">z2</span> <span style="color: #000080;">&gt;</span> B.<span style="color: #007788;">z2</span><span style="color: #008000;">&#41;</span>
			volume<span style="color: #000040;">+</span><span style="color: #000080;">=</span>devide<span style="color: #008000;">&#40;</span>mcube<span style="color: #008000;">&#40;</span>A.<span style="color: #007788;">x1</span>,A.<span style="color: #007788;">y1</span>,B.<span style="color: #007788;">z2</span>,A.<span style="color: #007788;">x2</span>,A.<span style="color: #007788;">y2</span>,A.<span style="color: #007788;">z2</span><span style="color: #008000;">&#41;</span>,pos<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> volume<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,totalvolume<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span>N<span style="color: #008080;">;</span>i<span style="color: #000080;">&gt;</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000040;">--</span><span style="color: #008000;">&#41;</span>
		totalvolume<span style="color: #000040;">+</span><span style="color: #000080;">=</span>devide<span style="color: #008000;">&#40;</span>Cubes<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%dn&quot;</span>,totalvolume<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p><strong>[文件匹配]</strong></p>
<p>这是NOI1997中最难的一道题，我在这道题上花费了一天时间才通过了。基本框架就是搜索，搜索出匹配串，对所有文件名按照规则匹配，判断是否可行，算出匹配的数目，更新最优值。</p>
<p>暴力的搜索连样例都过不了，我们需要深入分析，进行优化和剪枝。我的搜索顺序是从匹配串的第一位到最后一位(所有文件名长度最大值)。我们定义正文件为标记&#8217;+'的文件，负文件为标记&#8217;-'的文件。</p>
<p><strong>优化1</strong>.记录下所有用过的字符，顺序存入线性表，以备搜索时使用。</p>
<p><strong>优化2</strong>.去除多余的状态，例如多个*在一起是浪费的，*?和?*是一样的(但是和*不一样)，在产生状态时应避免出现。</p>
<p><strong>优化3</strong>.关于判断文件名是否匹配，在搜索出一位时，不需要把整个串与文件名匹配，如果前面都是匹配的，只需判断最后一位是否 成立，我们需要记录每个文件名已经前缀匹配到了哪一位。但是由于*的存在，使这个判断复杂性大大增加。例如当前的匹配串A*A对A1A2A前缀匹 配，A*A可以匹配到第3位(A1A)，也可以匹配到第5位(A1A2A)。而且由于后面扩展出的状态未知，我们也无法知道究竟匹配到哪一位是合适的，所 以必须都记录下。即对每个文件名开辟一个数组空间，存储该文件名可能匹配到的所有位置。在状态的扩展中，也需要对所有的可能分别扩展。在最终判断时，一个 文件名只要有一种可能使得完全匹配，就算是匹配成功。</p>
<p><strong>优化4</strong>.在搜索完匹配串的每一位，计算完全匹配的数目时，需要判断是否还有必要搜索下一位。对于以下三种情况，</p>
<ol>
<li>如果所有的正文件全部不能严格匹配，则再搜索下一位已经没有意义，剪枝；</li>
<li>如果前缀匹配的正文件的个数小于已有答案，再搜索下一位答案一定不会增加，剪枝；</li>
<li>如果匹配串末字符是*，当前答案小于最优答案，继续搜索一定是不会使答案增加，剪枝。</li>
</ol>
<p><strong>优化5</strong>.在搜索前先对所有的文件排序，使负文件名排在前面，有利于剪枝的提前发生。</p>
<p>上述5个优化，其中优化3是核心，也是算法的重要内容，大量编程的工作都是优化3；而优化4是关键，优化4的三个强力剪枝可以去除许多无用的状态，大大减少运行时间。</p>
<p>这道题虽然写了一天才搞定，收获却是非同一般得大。我个人认为这类题很好，很能考验构造思维能力和编程能力，甚至意志力，但近些年不论在 NOI还是NOIP，却都销声匿迹了。我预测如果今年NOI考这类题，仍然是个难题，能拿到高分的人不会多的。搜索+优化永远是一个万能算法，即使不为了 竞赛，真正掌握它也是很困难，确是很重要的。</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p866code20'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86620"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
</pre></td><td class="code" id="p866code20"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: NOI1997 wildcard
 * Author: Guo Jiabao
 * Time: 2009.2.15 20:17
 * State: Solved
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cmath&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">251</span>,MAXS<span style="color: #000080;">=</span><span style="color: #0000dd;">62</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">char</span> CharSet<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&quot;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> File<span style="color: #008000;">&#123;</span><span style="color: #0000ff;">int</span> name<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span>,len,matchpre<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span>,precnt<span style="color: #008080;">;</span><span style="color: #0000ff;">bool</span> permission<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> N,N_p,pattern<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span>,Apt<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span>,Max_Length,Ans,Nowlen,Al,ccnt<span style="color: #008080;">;</span>
File F<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">bool</span> used<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">200</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> chas<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">62</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">void</span> dfs<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">int</span> CharToID<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">char</span> c<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>c<span style="color: #000080;">&gt;=</span><span style="color: #FF0000;">'0'</span> <span style="color: #000040;">&amp;&amp;</span> c<span style="color: #000080;">&lt;=</span><span style="color: #FF0000;">'9'</span><span style="color: #008000;">&#41;</span><span style="color: #0000ff;">return</span> c<span style="color: #000040;">-</span><span style="color: #FF0000;">'0'</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span>c<span style="color: #000080;">&gt;=</span><span style="color: #FF0000;">'A'</span> <span style="color: #000040;">&amp;&amp;</span> c<span style="color: #000080;">&lt;=</span><span style="color: #FF0000;">'Z'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">?</span>c<span style="color: #000040;">-</span><span style="color: #FF0000;">'A'</span><span style="color: #000040;">+</span><span style="color: #0000dd;">10</span><span style="color: #008080;">:</span>c<span style="color: #000040;">-</span><span style="color: #FF0000;">'a'</span><span style="color: #000040;">+</span><span style="color: #0000dd;">36</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">int</span> cmp<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>a,<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>b<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span><span style="color: #0000ff;">return</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>File <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>a<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>permission<span style="color: #000080;">==</span><span style="color: #0000ff;">false</span><span style="color: #008080;">?</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">:</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,k<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">char</span> c,Name<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;wildcard.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;wildcard.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	c<span style="color: #000080;">=</span><span style="color: #0000dd;">getchar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>c<span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #0000ff;">EOF</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">ungetc</span><span style="color: #008000;">&#40;</span>c,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%s&quot;</span>,Name<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		N<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>Name<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">name</span><span style="color: #008000;">&#91;</span>i<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>k<span style="color: #000080;">=</span>CharToID<span style="color: #008000;">&#40;</span>Name<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			used<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span><span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">&gt;</span>Max_Length<span style="color: #008000;">&#41;</span>
			Max_Length<span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>
		c<span style="color: #000080;">=</span><span style="color: #0000dd;">getchar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>c<span style="color: #000080;">=</span><span style="color: #0000dd;">getchar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>c<span style="color: #000080;">==</span><span style="color: #FF0000;">'+'</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			N_p<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">permission</span><span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
			F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">permission</span><span style="color: #000080;">=</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		F<span style="color: #008000;">&#91;</span>N<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">precnt</span><span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		c<span style="color: #000080;">=</span><span style="color: #0000dd;">getchar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>c<span style="color: #000080;">=</span><span style="color: #0000dd;">getchar</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000dd;">qsort</span><span style="color: #008000;">&#40;</span>F<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>,N,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>,cmp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span>MAXS<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>used<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			chas<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>ccnt<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>i<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">bool</span> update<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> k<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j,Newans<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span>,Pans<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">bool</span> np<span style="color: #000080;">=</span><span style="color: #0000ff;">false</span>,tb<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		tb<span style="color: #000080;">=</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">precnt</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			tb<span style="color: #000040;">|</span><span style="color: #000080;">=</span>F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">matchpre</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span> <span style="color: #000040;">||</span> <span style="color: #008000;">&#40;</span> F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">matchpre</span><span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #000080;">&gt;=</span><span style="color: #0000dd;">0</span> <span style="color: #000040;">&amp;&amp;</span> pattern<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>tb<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">permission</span> <span style="color: #008000;">&#41;</span>
				Newans<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">else</span>
				np<span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span> <span style="color: #666666;">//匹配了负串</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">permission</span> <span style="color: #000040;">&amp;&amp;</span> F<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">precnt</span><span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
			Pans<span style="color: #000040;">++</span><span style="color: #008080;">;</span> <span style="color: #666666;">//记录正串不匹配的个数</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Pans<span style="color: #000080;">==</span>N_p <span style="color: #000040;">||</span> <span style="color: #008000;">&#40;</span>N_p<span style="color: #000040;">-</span>Pans<span style="color: #000080;">&lt;</span>Ans<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//若正串全部不匹配 或者 前缀匹配串的个数小于已有答案 剪枝</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pattern<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span> <span style="color: #000040;">&amp;&amp;</span> Newans<span style="color: #000080;">&lt;</span>Ans<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//如果匹配串末字符是*，当前答案小于最优，继续添加一定是多余的  剪枝</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>np<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Newans<span style="color: #000080;">&gt;</span>Ans<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			Ans<span style="color: #000080;">=</span>Newans<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>k<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
				Apt<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>pattern<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			Al<span style="color: #000080;">=</span>k<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Newans<span style="color: #000080;">==</span>Ans <span style="color: #000040;">&amp;&amp;</span> k<span style="color: #000080;">&lt;</span>Al<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>k<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
				Apt<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>pattern<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			Al<span style="color: #000080;">=</span>k<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> match<span style="color: #008000;">&#40;</span>File <span style="color: #000040;">&amp;</span>F,<span style="color: #0000ff;">int</span> len<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">bool</span> newpre<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #008000;">&#123;</span><span style="color: #0000ff;">false</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> k,i<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pattern<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;=</span>F.<span style="color: #007788;">precnt</span><span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F.<span style="color: #007788;">matchpre</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #000080;">&lt;=</span>F.<span style="color: #007788;">len</span> <span style="color: #000040;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span>pattern<span style="color: #008000;">&#91;</span>len<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #000040;">-</span><span style="color: #0000dd;">2</span> <span style="color: #000040;">||</span> F.<span style="color: #007788;">name</span><span style="color: #008000;">&#91;</span>F.<span style="color: #007788;">matchpre</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>pattern<span style="color: #008000;">&#91;</span>len<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
				newpre<span style="color: #008000;">&#91;</span>F.<span style="color: #007788;">matchpre</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;=</span>F.<span style="color: #007788;">precnt</span><span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span>F.<span style="color: #007788;">matchpre</span><span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>F.<span style="color: #007788;">len</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
				<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F.<span style="color: #007788;">name</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span>pattern<span style="color: #008000;">&#91;</span>len<span style="color: #008000;">&#93;</span> <span style="color: #000040;">||</span> pattern<span style="color: #008000;">&#91;</span>len<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #000040;">-</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#41;</span>
					newpre<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	F.<span style="color: #007788;">precnt</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>k<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">9</span><span style="color: #008080;">;</span>k<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>newpre<span style="color: #008000;">&#91;</span>k<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			F.<span style="color: #007788;">matchpre</span><span style="color: #008000;">&#91;</span> <span style="color: #000040;">++</span>F.<span style="color: #007788;">precnt</span> <span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>k<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> goon<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> len,<span style="color: #0000ff;">int</span> p<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>p<span style="color: #000080;">==</span>N<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>update<span style="color: #008000;">&#40;</span>len<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			dfs<span style="color: #008000;">&#40;</span>len<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">int</span> i,tprecnt,tmatch<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">10</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">precnt</span><span style="color: #000080;">==</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
		goon<span style="color: #008000;">&#40;</span>len,p<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #ff0000; font-style: italic;">/*backup*/</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>F<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">precnt</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			tmatch<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>F<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">matchpre</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		tprecnt<span style="color: #000080;">=</span>F<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">precnt</span><span style="color: #008080;">;</span>
		<span style="color: #ff0000; font-style: italic;">/*backup*/</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pattern<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			match<span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>,len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			goon<span style="color: #008000;">&#40;</span>len,p<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pattern<span style="color: #008000;">&#91;</span>len<span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
				match<span style="color: #008000;">&#40;</span>F<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>,len<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			goon<span style="color: #008000;">&#40;</span>len,p<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #ff0000; font-style: italic;">/*restore*/</span>
		F<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">precnt</span><span style="color: #000080;">=</span>tprecnt<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>F<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">precnt</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
			F<span style="color: #008000;">&#91;</span>p<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">matchpre</span><span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>tmatch<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		<span style="color: #ff0000; font-style: italic;">/*restore*/</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> dfs<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> len<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//-1:* -2:?</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>len<span style="color: #000080;">&gt;</span>Max_Length<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pattern<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #666666;">//**不连用 但允许?*</span>
	<span style="color: #008000;">&#123;</span>
		pattern<span style="color: #008000;">&#91;</span>len<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
		goon<span style="color: #008000;">&#40;</span>len,<span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>pattern<span style="color: #008000;">&#91;</span>len<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #666666;">//不允许*?</span>
	<span style="color: #008000;">&#123;</span>
		pattern<span style="color: #008000;">&#91;</span>len<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">2</span><span style="color: #008080;">;</span>
		goon<span style="color: #008000;">&#40;</span>len,<span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>ccnt<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		pattern<span style="color: #008000;">&#91;</span>len<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>chas<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		goon<span style="color: #008000;">&#40;</span>len,<span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%dn&quot;</span>,Ans<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>Al<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Apt<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">&gt;=</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000dd;">putchar</span><span style="color: #008000;">&#40;</span>CharSet<span style="color: #008000;">&#91;</span>Apt<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Apt<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">==</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000dd;">putchar</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">'*'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">else</span>
			<span style="color: #0000dd;">putchar</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">'?'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">putchar</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">'n'</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	dfs<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	print<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>顺便还说下，这道题SpecialJudge很有意思，由于可能没有唯一解，需要自己编写一个评测插件来判断解的正确性。在给 CmYkRgB123 Online Judge System编写评测插件时，我想到了用正则表达式的方法来判断，因为php中就有preg_match函数，但是这道题中的匹配串并不是真正的正则表达 式。可算让我想了一大会，才想到转化的方法。例如题中E*，转化为正则表达式就是/^E[a-zA-Z0-9]{0,8}$/，^表示必须从开头匹 配，$表示匹配到结尾[a-zA-Z0-9]{0,8}代表*，*只能匹配字母和数字，而且长度在[0,8]之间，很显然?就是[a-zA-Z0-9] {1}了。于是我写出了转化函数</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p866code21'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86621"><td class="code" id="p866code21"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> getz<span style="color: #009900;">&#40;</span><span style="color: #000088;">$Ab</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$str</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'/^'</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$Ab</span><span style="color: #339933;">=</span><a href="http://www.php.net/str_replace"><span style="color: #990000;">str_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'*'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'[a-zA-Z0-9]{0,8}'</span><span style="color: #339933;">,</span><span style="color: #000088;">$Ab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$Ab</span><span style="color: #339933;">=</span><a href="http://www.php.net/str_replace"><span style="color: #990000;">str_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'?'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'[a-zA-Z0-9]{1}'</span><span style="color: #339933;">,</span><span style="color: #000088;">$Ab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$str</span><span style="color: #339933;">.=</span><span style="color: #000088;">$Ab</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'$/'</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$str</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>判断函数就是</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p866code22'); return false;">View Code</a> PHP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p86622"><td class="code" id="p866code22"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> plugin_compare<span style="color: #009900;">&#40;</span><span style="color: #000088;">$fin</span><span style="color: #339933;">,</span><span style="color: #000088;">$fout</span><span style="color: #339933;">,</span><span style="color: #000088;">$fans</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$score</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<a href="http://www.php.net/fscanf"><span style="color: #990000;">fscanf</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fout</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%s</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$As</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.php.net/fscanf"><span style="color: #990000;">fscanf</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fout</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%s</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$Ab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.php.net/fscanf"><span style="color: #990000;">fscanf</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fans</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%s</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$Bs</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<a href="http://www.php.net/fscanf"><span style="color: #990000;">fscanf</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fans</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%s</span>&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$Bb</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$As</span><span style="color: #339933;">==</span><span style="color: #000088;">$Bs</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$score</span><span style="color: #339933;">=</span><span style="color:#800080;">0.5</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/strlen"><span style="color: #990000;">strlen</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$Ab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">==</span><a href="http://www.php.net/strlen"><span style="color: #990000;">strlen</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$Bb</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$zab</span><span style="color: #339933;">=</span>getz<span style="color: #009900;">&#40;</span><span style="color: #000088;">$Ab</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$score</span><span style="color: #339933;">=</span><span style="color:#800080;">0.6</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$pcnt</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><span style="color: #000088;">$wrong</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><a href="http://www.php.net/feof"><span style="color: #990000;">feof</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fin</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
			<span style="color: #009900;">&#123;</span>
				<a href="http://www.php.net/fscanf"><span style="color: #990000;">fscanf</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fin</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #009933; font-weight: bold;">%s</span> <span style="color: #009933; font-weight: bold;">%s</span>n&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$subject</span><span style="color: #339933;">,</span><span style="color: #000088;">$method</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$r</span><span style="color: #339933;">=</span><a href="http://www.php.net/preg_match"><span style="color: #990000;">preg_match</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$zab</span><span style="color: #339933;">,</span><span style="color: #000088;">$subject</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$r</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$method</span><span style="color: #339933;">==</span><span style="color: #0000ff;">'+'</span><span style="color: #009900;">&#41;</span>
					<span style="color: #000088;">$pcnt</span><span style="color: #339933;">++;</span>
				<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$r</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$method</span><span style="color: #339933;">==</span><span style="color: #0000ff;">'-'</span><span style="color: #009900;">&#41;</span>
					<span style="color: #000088;">$wrong</span><span style="color: #339933;">=</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$As</span><span style="color: #339933;">==</span><span style="color: #000088;">$pcnt</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$wrong</span><span style="color: #009900;">&#41;</span>
				<span style="color: #000088;">$score</span><span style="color: #339933;">=</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #000088;">$score</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>附上原题</p>
<blockquote>
<h2><span class="mw-headline">最佳游览</span></h2>
<p>有一座旅游城，它的街道成网格状．其中东西向的街道是“风景线、两旁分布着许多景观：南北向的街道都是林荫道，两旁没有任何建筑物。由于游客众多，风最线被规定为单行道，游客在风景线上只能从西走到东，林荫道上则可以任意行走。</p>
<p>一名游客将到这座旅游城旅游。他根据自己对景观的喜好给所有的风景线打了分，分值是从-100到+100的整数，分值越大表示我们的旅游者越喜欢这条风最线上的景致。显然这位游客不可能给这座旅游城的所有风景线都打负分。</p>
<pre>-50	–47	–36	–30	–23
17	–19	34	–13	–8
-42	–3	43	34	-45</pre>
<p>游客可以从旅游城的任一个十字路口开始游览，在任一个十字路口结束游览。我们的旅游者希望一路上游览的所有风最线的分值之和能够尽可能地大。请你写一个程序，帮助这位游客寻找一条最佳的游览路线。</p>
<p>输入输出</p>
<p>输入文件是INPUT.TXT。文件的第一行是两个整数M和N，之间用一个空格符隔开，M表示旅游城南北向林荫道的段数，N表示东西向风景 线的段数，1&lt;=M&lt;=100，1&lt;=N&lt;=20000。接下来的M行依次给出了由北向南各条风景线的分值信息。每行有N个整 数，依次表示了自西向东每段风景线的分值。同一行相邻两个数之间用一个空格隔开。</p>
<p>输出文件是OUTPUT.TXT。文件只有一行，含一个整数，表示你的程序所找到的最佳游览路线的总分值。</p>
<p>样例</p>
<p>INPUT.TXT</p>
<pre>3 6
50 -47 -36 -30 -23
17 -19 34 -13 -8
-42 -3 43 34 -45</pre>
<p>OUTPUT.TXT</p>
<pre>124</pre>
</blockquote>
<blockquote>
<h2><span class="mw-headline">竞赛排名 </span></h2>
<p>某市组织了一次中学生科技全能竞赛，每个选手要参加数学、物理、化学、天文、地理、生物、计算机和英语共八项竞赛,最后综合八项竞赛的成绩排出总名次。选手编号依次为：1,2&#8230;N（N为参赛总人数）。</p>
<p>设<a class="image" title="Image:Competitionsort 1.gif" href="http://www.ruvtex.cn/wiki/Image:Competitionsort_1.gif"><img longdesc="/wiki/Image:Competitionsort_1.gif" src="http://www.ruvtex.cn/mw/images/8/82/Competitionsort_1.gif" alt="Image:Competitionsort 1.gif" width="19" height="25" /></a>分别表示编号为i的选手第j项竞赛的成绩<a class="image" title="Image:Competitionsort 2.gif" href="http://www.ruvtex.cn/wiki/Image:Competitionsort_2.gif"><img longdesc="/wiki/Image:Competitionsort_2.gif" src="http://www.ruvtex.cn/mw/images/f/fd/Competitionsort_2.gif" alt="Image:Competitionsort 2.gif" width="137" height="21" /></a>。其它指标如下：</p>
<ul>
<li>第j项竞赛的平均分 <a class="image" title="Image:Competitionsort 3.gif" href="http://www.ruvtex.cn/wiki/Image:Competitionsort_3.gif"><img longdesc="/wiki/Image:Competitionsort_3.gif" src="http://www.ruvtex.cn/mw/images/d/df/Competitionsort_3.gif" alt="Image:Competitionsort 3.gif" width="177" height="45" /></a></li>
<li>选手i的总分 <a class="image" title="Image:Competitionsort 4.gif" href="http://www.ruvtex.cn/wiki/Image:Competitionsort_4.gif"><img longdesc="/wiki/Image:Competitionsort_4.gif" src="http://www.ruvtex.cn/mw/images/c/c2/Competitionsort_4.gif" alt="Image:Competitionsort 4.gif" width="168" height="47" /></a></li>
<li>选手i第j项竞赛的位置分 <a class="image" title="Image:Competitionsort 5.gif" href="http://www.ruvtex.cn/wiki/Image:Competitionsort_5.gif"><img longdesc="/wiki/Image:Competitionsort_5.gif" src="http://www.ruvtex.cn/mw/images/7/7c/Competitionsort_5.gif" alt="Image:Competitionsort 5.gif" width="439" height="117" /></a></li>
<li>选手i的总位置分 <a class="image" title="Image:Competitionsort 6.gif" href="http://www.ruvtex.cn/wiki/Image:Competitionsort_6.gif"><img longdesc="/wiki/Image:Competitionsort_6.gif" src="http://www.ruvtex.cn/mw/images/e/eb/Competitionsort_6.gif" alt="Image:Competitionsort 6.gif" width="245" height="45" /></a></li>
</ul>
<p>排名规则如下:</p>
<ol>
<li>总位置分高的选手名次在前：</li>
<li>若两个或两个以上的选手总位置分相同，则总分高的选手名次在前：</li>
<li>若两个或两个以上的选手总位置分和总分均相同，则编号在前的选手名次在前。</li>
</ol>
<p>请你为竞赛组委会编一程序，计算本次全能竞赛的总排名情况。</p>
<p>输入输出</p>
<p>输入文件为INPUT.TXT。文件的第一行为参赛总人数N<a class="image" title="Image:Competitionsort 7.gif" href="http://www.ruvtex.cn/wiki/Image:Competitionsort_7.gif"><img longdesc="/wiki/Image:Competitionsort_7.gif" src="http://www.ruvtex.cn/mw/images/c/c2/Competitionsort_7.gif" alt="Image:Competitionsort 7.gif" width="105" height="21" /></a>，从第二行到第N行依次为编号为1到编号为N的选手的成绩，每行有8个0～100之间的整数，代表该选手的8项竞赛成绩<a class="image" title="Image:Competitionsort 8.gif" href="http://www.ruvtex.cn/wiki/Image:Competitionsort_8.gif"><img longdesc="/wiki/Image:Competitionsort_8.gif" src="http://www.ruvtex.cn/mw/images/0/00/Competitionsort_8.gif" alt="Image:Competitionsort 8.gif" width="81" height="24" /></a>。同一行相邻两个数之间用一个空格符隔开。</p>
<p>输出文件为OUTPUT.TXT.  文件有N行，从第1行到第N行依次为排名第1的选手的编号，排名第2的选手的编号，…，排名第N的选手的编号。</p>
<p>样例</p>
<p>INPUT.TXT</p>
<pre>3
72 82 73 68 95 86 82 90
72 90 50 60 80 70 65 80
72 82 73 68 95 86 82 90</pre>
<p>OUTPUT.TXT</p>
<pre>1
3
2</pre>
</blockquote>
<blockquote>
<h2><span class="mw-headline">积木游戏 </span></h2>
<p>SERCOI 最近设计了一种积木游戏。每个游戏者有N块编号依次为1 ，2，…，N的长方体积木。对于每块积木,它的三条不同的边分别称为”a边”、“b边”和”c边”，如下图所示：</p>
<p><a class="image" title="Image:Buildinggame.PNG" href="http://www.ruvtex.cn/wiki/Image:Buildinggame.PNG"><img longdesc="/wiki/Image:Buildinggame.PNG" src="http://www.ruvtex.cn/mw/images/b/b8/Buildinggame.PNG" alt="Image:Buildinggame.PNG" width="229" height="160" /></a></p>
<p>游戏规则如下：</p>
<p>1.从N块积木中选出若干块，并将它们分成M（l&lt;=M&lt;=N） 堆，称为第1堆，第2 堆…，第M堆。每堆至少有1块积木，并且第K堆中任意一块积木的编号要大于第K+1堆中任意一块积木的编号(2&lt;=K&lt;=M)。</p>
<p>2.对于每一堆积木,游戏者要将它们垂直摞成一根柱子,并要求满足下面两个条件：</p>
<p>(1)除最顶上的一块积木外，任意一块积木的上表面同且仅同另一块积木的下表面接触，并且要求下面的积木的上表面能包含上面的积木的下表面，也就是说，要求下面的积木的上表面的两对边的长度分别大于等于上面的积木的两对边的长度。</p>
<p>(2)对于任意两块上下表面相接触的积木，下面的积木的编号要小于上面的积木的编号。</p>
<p>最后，根据每人所摞成的M根柱子的高度之和来决出胜负。</p>
<p>请你编一程序，寻找一种摞积木的方案，使得你所摞成的M根柱子的高度之和最大。</p>
<p>输入输出</p>
<p>输入文件是INPUT.TXT。文件的第一行有两个正整数N和M（1&lt;=M&lt;=N&lt;=100），分别表示积木总数和要求 摞成的柱子数。这两个数之间用一个空格符隔开。接下来N行依次是编号从1到N的N个积木的尺寸，每行有三个1至1000之间的整数，分别表示该积木a 边,b边和c边的长度。同一行相邻两个数之间用一个空格符隔开。</p>
<p>输出文件是OUTPUT.TXT。文件只有一行，为一个整数，表示M根柱子的高度之和。</p>
<p>样例</p>
<p>INPUT.TXT</p>
<pre>4 2
10 5 5
8 7 7
2 2 2
6 6 6</pre>
<p>OUTPUT.TXT</p>
<pre>24</pre>
</blockquote>
<blockquote>
<h2><span class="mw-headline">最优乘车 </span></h2>
<p>H城是一个旅游胜地，每年都有成千上万的人前来观光。为方便游客，巴士公司在各个旅游景点及宾馆，饭店等地都设置了巴士站并开通了一些单程巴上线路。每条单程巴士线路从某个巴士站出发，依次途经若干个巴士站，最终到达终点巴士站。</p>
<p>一名旅客最近到H城旅游，他很想去S公园游玩，但如果从他所在的饭店没有一路巴士可以直接到达S公园，则他可能要先乘某一路巴士坐几站，再下来换乘同一站台的另一路巴士, 这样换乘几次后到达S公园。</p>
<p>现在用整数1,2,…N 给H城的所有的巴士站编号，约定这名旅客所在饭店的巴士站编号为1,S公园巴士站的编号为N。</p>
<p>写一个程序，帮助这名旅客寻找一个最优乘车方案,使他在从饭店乘车到S公园的过程 中换车的次数最少。</p>
<p>输入输出</p>
<p>输入文件是INPUT.TXT。文件的第一行有两个数字M和N(1&lt;=M&lt;=100 1&lt;N&lt;=500），表示开通了M条单程巴士线路，总共有N个车站。从第二行到第M+1行依次给出了第1条到第M条巴士线路的信息。其中第 i+1行给出的是第i条巴士线路的信息，从左至右按运行顺序依次给出了该线路上的所有站号相邻两个站号之间用一个空格隔开。</p>
<p>输出文件是OUTPUT.TXT，文件只有一行。如果无法乘巴士从饭店到达S公园，则输出&#8221;N0&#8243;，否则输出你的程序所找到的最少换车次数，换车次数为0表示不需换车即可到达</p>
<p>样例</p>
<p>INPUT.TXT</p>
<pre>3 7
6 7
4 7 3 6
2 1 3 5</pre>
<p>OUTPUT.TXT</p>
<pre>2</pre>
</blockquote>
<blockquote>
<h2><span class="mw-headline">卫星覆盖 </span></h2>
<p>Cover</p>
<p>SERCOI（Space-Earth Resource Cover-Observe lnstitute）是一个致力于利用卫星技术对空间和地球资源进行覆盖观测的组织。现在他们研制成功一种新型资源观测卫星-SERCOI-308。这种 卫星可以覆盖空间直角坐标系中一定大小的立方体空间，卫星处于该立方体的中心。</p>
<p>其中（x,y,z）为立方体的中心点坐标，r为此中心点到立方体各个面的距离（即r为立方体高的一半）．立方体的各条边均平行于相应的坐标轴。我们可以用一个四元组(x,y,z,r)描述一颗卫星的状态，它所能覆盖的空间体积 。 由于一颗卫星所能覆盖的空间体积是有限的，因此空间中可能有若干颗卫星协同工作。它们所覆盖的空间区域可能有重叠的地方，如下图所示（阴影部分表示重叠的区域）。</p>
<p><a class="image" title="Image:Satellitecover.png" href="http://www.ruvtex.cn/wiki/Image:Satellitecover.png"><img longdesc="/wiki/Image:Satellitecover.png" src="http://www.ruvtex.cn/mw/images/5/58/Satellitecover.png" alt="Image:Satellitecover.png" width="197" height="200" /></a></p>
<p>写一个程序，根据给定的卫星分布情况，计算它们所覆盖的总体积。</p>
<p>输入输出</p>
<p>输入文件是INPU.TXT。文件的第一行是一个正整数N（1&lt;=N&lt;=100）：表示空间中的卫星总数。接下来的N行每行给 出了一颗卫星的状态，用空格隔开的四个正整数x,y,z,r依次表示了该卫星所能覆盖的立方体空间的中心点坐标和半高，其中 -1000&lt;=x,y,z&lt;=1000, 1&lt;=r&lt;=200。</p>
<p>输出文件是OUTPUT.TXT。文件只有一行,包括一个正整数，表示所有这些卫星所覆盖的空间总体积。</p>
<p>样例</p>
<p>INPUT.TXT</p>
<pre>3
0 0 0 3
1 -1 0 1
19 3 5 6</pre>
<p>OUTPUT.TXT</p>
<pre>1944</pre>
</blockquote>
<blockquote>
<h2><span class="mw-headline">文件匹配 </span></h2>
<p>在计算机的日常操作中，经常需要对当前回录下的所有文件中的一部分文件进行操作。例如，将当前目录下的所有文本文件复制至另一个目录下：将当前目录下所有以a 打头的文件删除; 等等。</p>
<p>很多操作系统都采用正则表达式来实现文件匹配功能。一种简单的正则表达式由英文字母（区分大小写）。数字及通配符”*”和”?”组成，”?”代表任意一个字符，”*””则可以代表零个或任意多个字符。</p>
<p>例如：</p>
<ul>
<li>a*b可以匹配acb(*代表c)
<ul>
<li>可以匹配aabb (*代表ab）</li>
<li>可以匹配asdsfdfdb (*代表sdsfdfd)</li>
<li>可以匹配ab (*不代表任何字符)</li>
</ul>
</li>
<li>a*b不可以匹配ac（缺少最右边的字母b)
<ul>
<li>不可以匹配bb（缺少最左边的字母a )</li>
<li>不可以匹配 abbc（最右边的字母不是b)</li>
</ul>
</li>
<li>a?b可以匹配acb（？代表c)
<ul>
<li>不可以匹配ab（缺少中间的一个字符）</li>
<li>不可以匹配accb（？只能代表一个字符）</li>
</ul>
</li>
</ul>
<p>现要对某目录下的部分文件进行操作。写一个程序,寻找一个正则表达式，使其能匹配的待操作文件最多，但不能匹配任何不进行操作的文件。注意你所找到的最优正则表达式的长度应当是最短的。如果有多个长度最短的最优正则表达式，则其中任意一个都是允许的。</p>
<p>输入输出</p>
<p>输入文件是INPUT.TXT.文件由N（1&lt;=N&lt;=250）行组成。每行给出了一个文件名（由英文字母和数字组成：英文字 符要区分大小写，文件名长度不超过8个字符），其后是一个空格符和一个字符（“+”或&#8221;-&#8221;）.“+”表示要对该行给出的文件进行操作，&#8221;-”表示不进行 操作。</p>
<p>输出文件是OUTPUT.TXT ，文件由两行组成。第一行是一个整数，给出了你的程序所找到的最优正则表达式所能匹配的文件数目．在第二行给出你的程序所找到的最优正则表达式。</p>
<p>样例</p>
<p>INPUT.TXT</p>
<pre>EXCHANGE +
EXT +
HARDWARE +
MOUSE -
NETWORK -</pre>
<p>OUTPUT.TXT</p>
<pre>2
E*</pre>
</blockquote>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/noi-2000-solution/" title="NOI 2000 解题报告">NOI 2000 解题报告</a></li><li><a href="http://www.byvoid.com/blog/noi-1998-solution/" title="NOI 1998 解题报告">NOI 1998 解题报告</a></li><li><a href="http://www.byvoid.com/blog/wc2010-efield/" title="WC2010 能量场">WC2010 能量场</a></li><li><a href="http://www.byvoid.com/blog/noi-1999-solution/" title="NOI 1999 解题报告">NOI 1999 解题报告</a></li><li><a href="http://www.byvoid.com/blog/usaco-531-milk-measuring/" title="USACO 5.3.1 Milk Measuring 量取牛奶 milk4">USACO 5.3.1 Milk Measuring 量取牛奶 milk4</a></li><li><a href="http://www.byvoid.com/blog/usaco-314-shaping-regions/" title="USACO 3.1.4 Shaping Regions 形成的区域">USACO 3.1.4 Shaping Regions 形成的区域</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/noi-1997-solution/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>POI 2001 Wandering flea trainers 跳舞蝇的教练</title>
		<link>http://www.byvoid.com/blog/poi-2001-pch/</link>
		<comments>http://www.byvoid.com/blog/poi-2001-pch/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 11:38:46 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[POI]]></category>
		<category><![CDATA[2001]]></category>
		<category><![CDATA[内向树]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[括号序列]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=844</guid>
		<description><![CDATA[题上描述这种图是很特殊的，每个顶点只有一条指出去的有向边，而且一定存在一个环，哪怕是自环，从任意一个顶点出发，最终一定进入一个环。我们的任务的判断这样的两个图是否同构。 ... ]]></description>
			<content:encoded><![CDATA[<p>题上描述这种图是很特殊的，每个顶点只有一条指出去的有向边，而且一定存在一个环，哪怕是自环，从任意一个顶点出发，最终一定进入一个环。我们的任务的判断这样的两个图是否同构。</p>
<p>首先，这个图不一定是弱连通的，可能会有多个连通分量，我们需要考虑每个连通分量。每个连通分量中一定存在一个环，去掉环上的边以后，剩下 的是一个森林，每棵树都是内向树。实际上它是环状内向树森林。对于两个内向树，我们可以很容易地判断它们是否同构，于是我们有了解决问题的方法。</p>
<p>首先是两个内向树，如果它们同构，它们的括号序列一定相同，反之也成立。判断两个环状内向树森林同构，首先应该满足环的大小相同，如果两 个环的顶点数都不一样，那么它们一定不会同构。如果环大小相同，则需要枚举两个环上的对应点，然后判断以环上每个顶点为根的内向树是否都同构。用上述方法 可以判断两个连通分量是否同构，对于题中给的两个图，首先判断连通分量的个数是否相同，然后用搜索的方法确定一个对应关系，以此判断每个每对连通分量是否 同构。如果存在一种对应方案使得所有的连通分量通过，那么这两个图同构。</p>
<p>上述方法中，生成所有内向树括号序列需要O(N^2logN)时间(需要排序)，枚举每个环的对应关系需要O(N)，判断两个内向树括号 序列相同需要O(N)，枚举连通分量间的对应关系由于是搜索，尽管实际搜索的很少，但是从时间复杂度上分析仍然是O(N!)。每个文件有D个测试数据，于 是总的时间复杂度是O((N^2logN+N^2*N!)*D)。但是实际上这个时间复杂度由于全部从最坏情况考虑(实际上所有最坏的情况不可能同时达 到)，所以是相当悲观的估计。实际编程对于N&lt;=2000，已经可以完全应付了。</p>
<p>在编程实现的时候，许多地方要用到链表，否则空间是不够用的。细节不容忽视。</p>
<p>关于内向树以及生成括号序列，请参看<a href="http://www.byvoid.com/blog/directed-tree-bracket-sequence/" target="_blank">有向树与树的括号序列表示法</a>。<br />
<span id="more-844"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p844code24'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p84424"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
</pre></td><td class="code" id="p844code24"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/* 
 * Problem: POI2001 pch
 * Author: Guo Jiabao
 * Time: 2009.2.5 14:05
 * State: Solved 
*/</span>
<span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;cstdio&gt;</span>
<span style="color: #339900;">#include &lt;cstdlib&gt;</span>
<span style="color: #339900;">#include &lt;cstring&gt;</span>
<span style="color: #339900;">#include &lt;string&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">int</span> MAXN<span style="color: #000080;">=</span><span style="color: #0000dd;">4001</span>,PERN<span style="color: #000080;">=</span><span style="color: #0000dd;">2000</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> edge<span style="color: #008000;">&#123;</span><span style="color: #0000ff;">int</span> t<span style="color: #008080;">;</span>edge <span style="color: #000040;">*</span>next<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> sequence<span style="color: #008000;">&#123;</span><span style="color: #0000ff;">int</span> len<span style="color: #008080;">;</span>string s<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">struct</span> subsq<span style="color: #008000;">&#123;</span><span style="color: #0000ff;">int</span> len<span style="color: #008080;">;</span>string <span style="color: #000040;">*</span>s<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> T<span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">class</span> linknode
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
		linknode <span style="color: #000040;">*</span>next<span style="color: #008080;">;</span>
		T s<span style="color: #008080;">;</span>
		linknode<span style="color: #008000;">&#40;</span>T ts<span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>next<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>,s<span style="color: #008000;">&#40;</span>ts<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">template</span> <span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> T<span style="color: #000080;">&gt;</span> <span style="color: #0000ff;">class</span> linklist
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
		linknode<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span> <span style="color: #000040;">*</span>f,<span style="color: #000040;">*</span>l<span style="color: #008080;">;</span>
		linklist<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">:</span>f<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span>,l<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">void</span> ins<span style="color: #008000;">&#40;</span>T s<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>l<span style="color: #008000;">&#41;</span>l<span style="color: #000080;">=</span>l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #000080;">=</span><span style="color: #0000dd;">new</span> linknode<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">else</span> f<span style="color: #000080;">=</span>l<span style="color: #000080;">=</span><span style="color: #0000dd;">new</span> linknode<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">void</span> clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			linknode<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span> <span style="color: #000040;">*</span>a<span style="color: #000080;">=</span>f,<span style="color: #000040;">*</span>b<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">while</span> <span style="color: #008000;">&#40;</span>a<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#123;</span>b<span style="color: #000080;">=</span>a<span style="color: #008080;">;</span>a<span style="color: #000080;">=</span>a<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008080;">;</span><span style="color: #0000dd;">delete</span> b<span style="color: #008080;">;</span><span style="color: #008000;">&#125;</span>
			f<span style="color: #000080;">=</span>l<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> D,N,Ec,Bc,S1,S2<span style="color: #008080;">;</span>
<span style="color: #0000ff;">int</span> Bel<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #666666;">//每个顶点所属连通分量</span>
<span style="color: #0000ff;">int</span> TB<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,TC<span style="color: #008080;">;</span> <span style="color: #666666;">//暂存正向搜索的连通分量</span>
linklist<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> Circle<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//链表存储每个圈</span>
<span style="color: #0000ff;">bool</span> inCircle<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//记录每个节节点</span>
<span style="color: #0000ff;">bool</span> used<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//生成排列时DFS用到的记录数组</span>
sequence seq<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//每个子树的括号序列</span>
<span style="color: #0000ff;">int</span> Cs<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//每个圈的大小</span>
edge E<span style="color: #008000;">&#91;</span>MAXN<span style="color: #000040;">*</span><span style="color: #0000dd;">2</span><span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #666666;">//边集的空间</span>
edge <span style="color: #000040;">*</span>Ap<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span>,<span style="color: #000040;">*</span>An<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #666666;">//正图和逆图的邻接表</span>
subsq S<span style="color: #008000;">&#91;</span>MAXN<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span><span style="color: #666666;">//暂存括号序列</span>
&nbsp;
<span style="color: #0000ff;">void</span> addedge<span style="color: #008000;">&#40;</span>edge <span style="color: #000040;">*</span><span style="color: #000040;">&amp;</span>A,<span style="color: #0000ff;">int</span> t<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>A<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		edge <span style="color: #000040;">*</span>t<span style="color: #000080;">=</span>A<span style="color: #008080;">;</span>
		A<span style="color: #000080;">=</span><span style="color: #000040;">&amp;</span>E<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>Ec<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		A<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #000080;">=</span>t<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		A<span style="color: #000080;">=</span><span style="color: #000040;">&amp;</span>E<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>Ec<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		A<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	E<span style="color: #008000;">&#91;</span>Ec<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">t</span><span style="color: #000080;">=</span>t<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,t<span style="color: #008080;">;</span>
	Ec<span style="color: #000080;">=</span><span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>Bc<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>Ap,<span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>Ap<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">memset</span><span style="color: #008000;">&#40;</span>An,<span style="color: #0000dd;">0</span>,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>An<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		addedge<span style="color: #008000;">&#40;</span>Ap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		addedge<span style="color: #008000;">&#40;</span>An<span style="color: #008000;">&#91;</span>t<span style="color: #008000;">&#93;</span>,i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		Bel<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		seq<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		seq<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;&quot;</span><span style="color: #008080;">;</span>
		inCircle<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span>PERN<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>PERN<span style="color: #000040;">+</span>N<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		t<span style="color: #000040;">+</span><span style="color: #000080;">=</span>PERN<span style="color: #008080;">;</span>
		addedge<span style="color: #008000;">&#40;</span>Ap<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>,t<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		addedge<span style="color: #008000;">&#40;</span>An<span style="color: #008000;">&#91;</span>t<span style="color: #008000;">&#93;</span>,i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		Bel<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		seq<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		seq<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span><span style="color: #000080;">=</span><span style="color: #FF0000;">&quot;&quot;</span><span style="color: #008080;">;</span>
		inCircle<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> connect_dfs_n<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> u<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//逆向求连通分量</span>
<span style="color: #008000;">&#123;</span>
	Bel<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>Bc<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>edge <span style="color: #000040;">*</span>k<span style="color: #000080;">=</span>An<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>k<span style="color: #008080;">;</span>k<span style="color: #000080;">=</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> v<span style="color: #000080;">=</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>t<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>Bel<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
			connect_dfs_n<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> connect_dfs_p<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> u<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//正向求连通分量，并查找圈</span>
<span style="color: #008000;">&#123;</span>
	Bel<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>Bc<span style="color: #008080;">;</span>
	TB<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>TC<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>u<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> v<span style="color: #000080;">=</span>Ap<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>t<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>Bel<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> r<span style="color: #000080;">=</span>connect_dfs_p<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>r<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #000040;">++</span>Cs<span style="color: #008000;">&#91;</span>Bc<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
			Circle<span style="color: #008000;">&#91;</span>Bc<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ins</span><span style="color: #008000;">&#40;</span>u<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			inCircle<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>r<span style="color: #000080;">==</span>u<span style="color: #008000;">&#41;</span>
				<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">else</span>
				<span style="color: #0000ff;">return</span> r<span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">else</span>
			<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">else</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #000040;">++</span>Cs<span style="color: #008000;">&#91;</span>Bc<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
		Circle<span style="color: #008000;">&#91;</span>Bc<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">ins</span><span style="color: #008000;">&#40;</span>u<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		inCircle<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>u<span style="color: #000080;">==</span>v<span style="color: #008000;">&#41;</span> v<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> v<span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> connect<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> A,<span style="color: #0000ff;">int</span> B<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span>A<span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>B<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>Bel<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			Bc<span style="color: #000040;">++</span><span style="color: #008080;">;</span>
			Cs<span style="color: #008000;">&#91;</span>Bc<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			TC<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
			connect_dfs_p<span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;=</span>TC<span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
				connect_dfs_n<span style="color: #008000;">&#40;</span>TB<span style="color: #008000;">&#91;</span>j<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">inline</span> <span style="color: #0000ff;">int</span> cmp<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>a,<span style="color: #0000ff;">const</span> <span style="color: #0000ff;">void</span> <span style="color: #000040;">*</span>b<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">return</span>  <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>subsq <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>a<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>s<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>compare<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>subsq <span style="color: #000040;">*</span><span style="color: #008000;">&#41;</span>b<span style="color: #008000;">&#41;</span><span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>s<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> TreeSeq<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> u<span style="color: #008000;">&#41;</span><span style="color: #666666;">//求内向树序列</span>
<span style="color: #008000;">&#123;</span>
	linklist<span style="color: #000080;">&lt;</span>subsq<span style="color: #000080;">&gt;</span> LL<span style="color: #008080;">;</span>
	subsq T<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">int</span> L<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
	<span style="color: #000040;">++</span>seq<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span><span style="color: #008080;">;</span>
	seq<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span><span style="color: #FF0000;">'('</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>edge <span style="color: #000040;">*</span>k<span style="color: #000080;">=</span>An<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>k<span style="color: #008080;">;</span>k<span style="color: #000080;">=</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">int</span> v<span style="color: #000080;">=</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>t<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>inCircle<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">continue</span><span style="color: #008080;">;</span>
		TreeSeq<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		T.<span style="color: #007788;">s</span><span style="color: #000080;">=</span><span style="color: #000040;">&amp;</span>seq<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span><span style="color: #008080;">;</span>
		T.<span style="color: #007788;">len</span><span style="color: #000080;">=</span>seq<span style="color: #008000;">&#91;</span>v<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span><span style="color: #008080;">;</span>
		LL.<span style="color: #007788;">ins</span><span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>linknode<span style="color: #000080;">&lt;</span>subsq<span style="color: #000080;">&gt;</span> <span style="color: #000040;">*</span>p<span style="color: #000080;">=</span>LL.<span style="color: #007788;">f</span><span style="color: #008080;">;</span>p<span style="color: #008080;">;</span>p<span style="color: #000080;">=</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span>
		S<span style="color: #008000;">&#91;</span><span style="color: #000040;">++</span>L<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span>p<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>s<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">qsort</span><span style="color: #008000;">&#40;</span>S<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span>,L,<span style="color: #0000dd;">sizeof</span><span style="color: #008000;">&#40;</span>S<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span>,cmp<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>L<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		seq<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span><span style="color: #000040;">*</span><span style="color: #008000;">&#40;</span>S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		seq<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span>S<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #000040;">++</span>seq<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span><span style="color: #008080;">;</span>
	seq<span style="color: #008000;">&#91;</span>u<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span><span style="color: #000040;">+</span><span style="color: #000080;">=</span><span style="color: #FF0000;">')'</span><span style="color: #008080;">;</span>
	LL.<span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> compare<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a,<span style="color: #0000ff;">int</span> b<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>Cs<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>Cs<span style="color: #008000;">&#91;</span>b<span style="color: #008000;">&#93;</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span> <span style="color: #666666;">//圈大小不相等</span>
	linknode<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> <span style="color: #000040;">*</span>k,<span style="color: #000040;">*</span>l,<span style="color: #000040;">*</span>pl<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>pl<span style="color: #000080;">=</span>Circle<span style="color: #008000;">&#91;</span>b<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">f</span><span style="color: #008080;">;</span>pl<span style="color: #008080;">;</span>pl<span style="color: #000080;">=</span>pl<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//枚举偏移量</span>
	<span style="color: #008000;">&#123;</span>
		l<span style="color: #000080;">=</span>pl<span style="color: #008080;">;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">=</span>Circle<span style="color: #008000;">&#91;</span>a<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">f</span><span style="color: #008080;">;</span>k<span style="color: #008080;">;</span>k<span style="color: #000080;">=</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			<span style="color: #0000ff;">int</span> x<span style="color: #000080;">=</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>s,y<span style="color: #000080;">=</span>l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>s<span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span><span style="color: #008000;">&#40;</span>l<span style="color: #000080;">=</span>l<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> l<span style="color: #000080;">=</span>Circle<span style="color: #008000;">&#91;</span>b<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">f</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>seq<span style="color: #008000;">&#91;</span>x<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>seq<span style="color: #008000;">&#91;</span>y<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">len</span> <span style="color: #000040;">||</span> seq<span style="color: #008000;">&#91;</span>x<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span><span style="color: #000040;">!</span><span style="color: #000080;">=</span>seq<span style="color: #008000;">&#91;</span>y<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">s</span><span style="color: #008000;">&#41;</span> <span style="color: #666666;">//内向树序列不相同</span>
				<span style="color: #0000ff;">break</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>k<span style="color: #008000;">&#41;</span>
			<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> arrange_dfs<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> k<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//生成两图连通分量对应关系的排列</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>k<span style="color: #000080;">&gt;</span>S1<span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span>S1<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>S2<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #000040;">!</span>used<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span> <span style="color: #000040;">&amp;&amp;</span> compare<span style="color: #008000;">&#40;</span>k,i<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
			used<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">bool</span> b<span style="color: #000080;">=</span>arrange_dfs<span style="color: #008000;">&#40;</span>k<span style="color: #000040;">+</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
			used<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span><span style="color: #000080;">=</span><span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
			<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>b<span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #008080;">;</span>
		<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i,j<span style="color: #008080;">;</span>
	init<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	connect<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span>,N<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>S1<span style="color: #000080;">=</span>Bc<span style="color: #008080;">;</span>
	connect<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #000040;">+</span>PERN,N<span style="color: #000040;">+</span>PERN<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>S2<span style="color: #000080;">=</span>Bc<span style="color: #008080;">;</span>
	<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>S1<span style="color: #000040;">!</span><span style="color: #000080;">=</span>S2<span style="color: #000040;">-</span>S1<span style="color: #008000;">&#41;</span> <span style="color: #666666;">//1..S1为图1的连通分量 S1+1..S2为图2的连通分量</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #008080;">;</span> <span style="color: #666666;">//两图连通分量个数不相等</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>S2<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>linknode<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> <span style="color: #000040;">*</span>k<span style="color: #000080;">=</span>Circle<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">f</span><span style="color: #008080;">;</span>k<span style="color: #008080;">;</span>k<span style="color: #000080;">=</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>next<span style="color: #008000;">&#41;</span>
			TreeSeq<span style="color: #008000;">&#40;</span>k<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>s<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//计算以每个圈上顶点为根的内向树括号序列</span>
	<span style="color: #0000ff;">return</span> arrange_dfs<span style="color: #008000;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>S2<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
		Circle<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#93;</span>.<span style="color: #007788;">clear</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">int</span> i<span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pch.in&quot;</span>,<span style="color: #FF0000;">&quot;r&quot;</span>,<span style="color: #0000ff;">stdin</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">freopen</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;pch.out&quot;</span>,<span style="color: #FF0000;">&quot;w&quot;</span>,<span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000dd;">scanf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;%d&quot;</span>,<span style="color: #000040;">&amp;</span>D<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span>i<span style="color: #000080;">=</span><span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;=</span>D<span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #0000ff;">if</span> <span style="color: #008000;">&#40;</span>solve<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
			<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Tn&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">else</span>
			<span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;Nn&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		clear<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #666666;">//清理 释放内存</span>
	<span style="color: #008000;">&#125;</span>
	<span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<blockquote>
<h2><span class="mw-headline">跳舞蝇的教练 </span></h2>
<p>Byteland一直以奇妙的跳舞蝇而闻名于世。驯养的苍蝇能和着音乐的节奏精确地做每一次飞跃。通常，训练者会在桌上放一排硬币，这些硬币的排列 并不按照特定的顺序。每枚硬币上都有一行题字：i→j，i是这枚硬币的编号，j是站在硬币i上的苍蝇下一步应该飞往的硬币编号。训练者在每个硬币上放一只 苍蝇，然后开始放音乐。那些苍蝇就跟着音乐的节拍开始跳舞，在每一拍中苍蝇都会直接跳到编号为j的硬币上。在舞蹈中，可能会出现多只苍蝇在同一硬币上的情 况。这样，跳舞蝇就会一起继续表演。假定有n只苍蝇，n枚硬币。则一旦确定了n枚硬币上的题字，那么这场表演也就确定了。然而，对硬币不同的设置也可能导 致相同的表演，只要我们把硬币按适当的顺序排列。 让我们先来看3枚硬币上的表演。如果表演是这样进行：从第一个硬币到第二个，第二个到第三个，第三个又回到第一个硬币（表示为1→2，2→3，3→1）。 具体表演是3只苍蝇绕圈跳跃，从不相遇。那么表演1→2，2→3，3→3，则是与其不同的。因为该表演为：两拍后，所有的苍蝇在第3枚硬币上相遇，然后一 直在原地跳跃。</p>
<p>但是，设置1→2，2→3，3→2，4→4和1→1、2→3、3→2、4→3就是同样的类型。如果你把前者的硬币从左到右排列，而把后者从右到左排列，就会看到相同的表演。</p>
<p>任务：</p>
<p>如果跳舞蝇的两次表演是相同的，就会使观众不满，请编写一个程序：</p>
<ul>
<li>从文件中读入测试任务的个数；</li>
<li>对每一个测试任务，从PCH.IN中读入两组硬币设置，验证是否能把硬币按一定顺序排列，使跳舞蝇给出相同的表演；</li>
<li>把结果写入文件。</li>
</ul>
<p>输入：</p>
<p>文件的第一行是测试任务的个数d(1≤d≤100)，以下3*d行，每三行描述一个任务。三行中的第一行是一个整数 n(1≤n≤2000)，表示硬币的个数。后两行每行均为一套硬币的描述。格式为n个用空格分开的1…n范围内的整数，第i个整数表示硬币i上的苍蝇应该 飞向的硬币的编号。</p>
<p>输出：</p>
<p>对每个任务，均要在文件中输出一行，仅包含一个字母。如果可以按一定顺序排硬币使表演相同则输出“T”，否则输出“N”。</p>
<p>输入样例：</p>
<pre>2
3
2 3 1
2 3 3
4
2 3 2 4
1 3 2 3</pre>
<p>输出样例：</p>
<pre>N
T</pre>
</blockquote>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/directed-tree-bracket-sequence/" title="有向树与树的括号序列最小表示法">有向树与树的括号序列最小表示法</a></li><li><a href="http://www.byvoid.com/blog/poi-2001-kop/" title="POI 2001 Glodmine 金矿">POI 2001 Glodmine 金矿</a></li><li><a href="http://www.byvoid.com/blog/poi-2001-pod/" title="POI 2001 Travel 旅行">POI 2001 Travel 旅行</a></li><li><a href="http://www.byvoid.com/blog/poi-2001-mro/" title="POI 2001 Ants and the ladybug 蚂蚁和瓢虫">POI 2001 Ants and the ladybug 蚂蚁和瓢虫</a></li><li><a href="http://www.byvoid.com/blog/poi-2001-spo/" title="POI 2001 Peaceful Commission 和平委员会">POI 2001 Peaceful Commission 和平委员会</a></li><li><a href="http://www.byvoid.com/blog/poi-2001-ant/" title="POI 2001 Antiprime Numbers 反质数">POI 2001 Antiprime Numbers 反质数</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/poi-2001-pch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>有向树与树的括号序列最小表示法</title>
		<link>http://www.byvoid.com/blog/directed-tree-bracket-sequence/</link>
		<comments>http://www.byvoid.com/blog/directed-tree-bracket-sequence/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 06:36:46 +0000</pubDate>
		<dc:creator>BYVoid</dc:creator>
				<category><![CDATA[計算機科學]]></category>
		<category><![CDATA[内向树]]></category>
		<category><![CDATA[同构]]></category>
		<category><![CDATA[图论]]></category>
		<category><![CDATA[外向树]]></category>
		<category><![CDATA[括号序列]]></category>
		<category><![CDATA[最小表示法]]></category>
		<category><![CDATA[有向图]]></category>
		<category><![CDATA[有向树]]></category>
		<category><![CDATA[有根树]]></category>

		<guid isPermaLink="false">http://www.byvoid.com/blog/?p=839</guid>
		<description><![CDATA[[有向树] 一个弱连通有向图，若去掉方向后得到一棵树，则称此有向图为一棵有向树，记为T。 [外向树] 若一个有向树T，有且只有一个顶点入度为0，其余顶点入度都为1，则称T为外向树。T中入... ]]></description>
			<content:encoded><![CDATA[<p><strong>[有向树]</strong> 一个弱连通有向图，若去掉方向后得到一棵树，则称此有向图为一棵有<strong>向树</strong>，记为T。</p>
<p><strong>[外向树]</strong> 若一个有向树T，有且只有一个顶点<strong>入度为0</strong>，其余顶点入度都为1，则称T为<strong>外向树</strong>。T中入度为0的节点被称为T的<strong>根节点</strong>，出度为0的节点被称为T的<strong>叶节点</strong>。每个节点的有向边指向的节点被称为该节点的<strong>子节点</strong>。</p>
<p><strong>[内向树]</strong> 若一个有向树T，有且只有一个顶点<strong>出度为0</strong>，其余顶点出度都为1，则称T为<strong>内</strong><strong>向树</strong>。T中出度为0的节点被称为T的<strong>根节点</strong>，入度为0的节点被称为T的<strong>叶节点</strong>。每个节点的有向边的反向边指向的节点被称为该节点的<strong>子节点</strong>。</p>
<p>外向树和内向树都是<strong>有根树</strong>。</p>
<table border="0">
<tbody>
<tr>
<td><img class="alignnone size-full wp-image-837" title="e5a496e59091e6a091" src="http://www.byvoid.com/blog/wp-content/uploads/2009/02/e5a496e59091e6a091.png" alt="e5a496e59091e6a091" width="162" height="200" /></td>
<td><img class="alignnone size-full wp-image-838" title="e58685e59091e6a091" src="http://www.byvoid.com/blog/wp-content/uploads/2009/02/e58685e59091e6a091.png" alt="e58685e59091e6a091" width="162" height="200" /></td>
</tr>
<tr>
<td style="text-align: center;">图1</td>
<td style="text-align: center;">图2</td>
</tr>
</tbody>
</table>
<p>如上，图1为一棵外向树，图2为一棵内向树。</p>
<p><strong>[树的括号序列最小表示法]</strong></p>
<p>定义S[t]表示以t为根的子树的括号序列</p>
<p>S[t]=</p>
<p>{</p>
<p>&#8216;(&#8216;,&#8217;)&#8217; (如果t为叶节点)</p>
<p>&#8216;(&#8216;,S[c1],S[c2],&#8230;,S[ck],&#8217;)&#8217; (c1,c2,&#8230;,ck为t的k个子节点，S[c1],S[c2],&#8230;,S[ck]要按照字典序排列)</p>
<p>}</p>
<p>为了保证<strong>同构</strong>的树的括号序列表示具有<strong>唯一性</strong>，我们必须规定子树点的顺序。按照子树的括号序列的字典序就是一种不错的方法。</p>
<p>例如上述图2，它的括号序列最小表示就是<strong>((()()())())</strong>。</p>
<p><strong>[有根树的同构]</strong></p>
<p>对于一个有根树，我们可以通过比较他们的括号序列的最小表示，如果他们的括号序列最小表示完全相等，那么他们<strong>同构</strong>。</p>
<p><em><a href="http://www.byvoid.com">BYVoid</a> 原创讲解，转载请注明。</em></p>
<h3  class="related_post_title">Maybe you like</h3><ul class="related_post"><li><a href="http://www.byvoid.com/blog/poi-2001-pch/" title="POI 2001 Wandering flea trainers 跳舞蝇的教练">POI 2001 Wandering flea trainers 跳舞蝇的教练</a></li><li><a href="http://www.byvoid.com/blog/scc-tarjan/" title="有向图强连通分量的Tarjan算法">有向图强连通分量的Tarjan算法</a></li><li><a href="http://www.byvoid.com/blog/noi-1997-solution/" title="NOI 1997 解题报告">NOI 1997 解题报告</a></li><li><a href="http://www.byvoid.com/blog/poi-1998-gon/" title="POI 1998 追赶 Chase">POI 1998 追赶 Chase</a></li><li><a href="http://www.byvoid.com/blog/ural-1183/" title="Ural 1183 Brackets sequence">Ural 1183 Brackets sequence</a></li><li><a href="http://www.byvoid.com/blog/usaco-mar07-silver-cow-traffic/" title="USACO MAR07 Silver Cow Traffic 奶牛交通">USACO MAR07 Silver Cow Traffic 奶牛交通</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.byvoid.com/blog/directed-tree-bracket-sequence/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
