﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-心無雜念的空白-文章分类-Algorithm</title><link>http://www.cppblog.com/lshain/category/17296.html</link><description>Beyond this world...</description><language>zh-cn</language><lastBuildDate>Tue, 31 Jan 2012 02:10:17 GMT</lastBuildDate><pubDate>Tue, 31 Jan 2012 02:10:17 GMT</pubDate><ttl>60</ttl><item><title>Timus 1208 Legendary Teams Contest(题解)</title><link>http://www.cppblog.com/lshain/articles/151564.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Thu, 21 Jul 2011 09:44:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/151564.html</guid><wfw:comment>http://www.cppblog.com/lshain/comments/151564.html</wfw:comment><comments>http://www.cppblog.com/lshain/articles/151564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshain/comments/commentRss/151564.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshain/services/trackbacks/151564.html</trackback:ping><description><![CDATA[<a href="http://acm.timus.ru/problem.aspx?space=1&amp;num=1208">http://acm.timus.ru/problem.aspx?space=1&amp;num=1208</a><br /><br />题目大意：给出n个队,n&lt;=18, 每队包含三个人名，求n个队中最多选出几个队，选出的队中的人名不重复。<br />思路：i队和j队，如果有相同名字的队员，则连一无向边i-j，题目变为求给定无向图G的最大独立集，由于n不大，直接建图暴力枚举的。O(n*2^n)复杂度。<br /><br />Code:<br />
<p>#include&lt;cstdio&gt;<br />#include&lt;cstring&gt;<br />#include&lt;cstdlib&gt;</p>
<p>struct Node{<br />&nbsp;char member[3][21];<br />}teamSet[20];<br />int n;<br />unsigned int graph[21][21];<br />unsigned int teams[20];</p>
<p>unsigned int isOk(int I, int J){<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;int j = 0;<br />&nbsp;&nbsp;&nbsp;unsigned int flag = 0;<br />&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; 3 &amp;&amp; !flag; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 0; j &lt; 3; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!strcmp(teamSet[I].member[i], teamSet[J].member[j])){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;return flag;<br />}</p>
<p>int Check(unsigned int team){<br />&nbsp;&nbsp;&nbsp;unsigned int c = 0;<br />&nbsp;&nbsp;&nbsp;unsigned int tempSet = 0;<br />&nbsp;&nbsp;&nbsp;int nCount = 0;<br />&nbsp;&nbsp;&nbsp;int num = n;<br />&nbsp;&nbsp;&nbsp;int isValid = 1;<br />&nbsp;&nbsp;&nbsp;c = 0x00020000;<br />&nbsp;&nbsp;&nbsp;while(num++ &lt; 18){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c &gt;&gt;= 1;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;for(num = n; c &gt; 0; c &gt;&gt;= 1, num--){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(c&amp;team){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nCount++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tempSet&amp;c){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isValid = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempSet |= teams[n - num + 1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;return (1 == isValid) ? nCount : -1;<br />}</p>
<p>int main(int argc, char* argv[], char* env[])<br />{<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;int j = 0;<br />&nbsp;&nbsp;&nbsp;int t = 0;<br />&nbsp;&nbsp;&nbsp;int maxTeams = 0;<br />&nbsp;&nbsp;&nbsp;unsigned int c = 0;<br />&nbsp;&nbsp;&nbsp;unsigned int tempN = 0;<br />&nbsp;&nbsp;&nbsp;while(scanf("%d", &amp;n) != EOF){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt;= n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s%s%s", teamSet[i].member[0],&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;teamSet[i].member[1], teamSet[i].member[2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt;= n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graph[i][i] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = i + 1; j &lt;= n; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graph[i][j] = graph[j][i] = isOk(i, j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt;= n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;teams[i] = graph[i][j];;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 2; j &lt;= n; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;teams[i] &lt;&lt;= 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;teams[i] |= graph[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxTeams = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempN = 1 &lt;&lt; n;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(c = 1; c &lt; tempN; c++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = Check(c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(t &gt; maxTeams){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxTeams = t;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n", maxTeams);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return 0;<br />}<br /></p> <img src ="http://www.cppblog.com/lshain/aggbug/151564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-07-21 17:44 <a href="http://www.cppblog.com/lshain/articles/151564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Timus 1353. Milliard Vasya's Function(题解)</title><link>http://www.cppblog.com/lshain/articles/151543.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Thu, 21 Jul 2011 06:11:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/151543.html</guid><wfw:comment>http://www.cppblog.com/lshain/comments/151543.html</wfw:comment><comments>http://www.cppblog.com/lshain/articles/151543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshain/comments/commentRss/151543.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshain/services/trackbacks/151543.html</trackback:ping><description><![CDATA[<h2 class="problem_title">1353. Milliard Vasya's Function</h2>
<div class="problem_limits">Time Limit: 1.0 second<br />Memory Limit: 16 MB<br /></div>
<div id="problem_text">
<div class="problem_par">
<div class="problem_par_normal">Vasya is the beginning mathematician. He decided to make an important contribution to the science and to become famous all over the world. But how can he do that if the most interesting facts such as Pythagor&#8217;s theorem are already proved? Correct! He is to think out something his own, original. So he thought out the Theory of Vasya&#8217;s Functions. Vasya&#8217;s Functions (VF) are rather simple: the value of the <em>N</em><sup>th</sup> VF in the point <em>S</em> is an amount of integers from 1 to <em>N</em> that have the sum of digits <em>S</em>. You seem to be great programmers, so Vasya gave you a task to find the milliard VF value (i.e. the VF with <em>N</em> = 10<sup>9</sup>) because Vasya himself won&#8217;t cope with the task. Can you solve the problem?</div></div>
<h3 class="problem_subtitle">Input</h3>
<div class="problem_par">
<div class="problem_par_normal">Integer <em>S</em> (1 &#8804; <em>S</em> &#8804; 81).</div></div>
<h3 class="problem_subtitle">Output</h3>
<div class="problem_par">
<div class="problem_par_normal">The milliard VF value in the point <em>S</em>.</div></div>
<h3 class="problem_subtitle">Sample</h3>
<table class="sample">
<colgroup>
<col width="350">
<col width="350">
<tbody>
<tr>
<th>input</th>
<th>output</th></tr>
<tr>
<td><pre class="intable">1
</pre></td>
<td><pre class="intable">10
</pre></td></tr></tbody></table></div><br />题意：输入s，输出自然数1...N中各位数字之和等于s的数的个数。<br />解题思路：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP:&nbsp;&nbsp;&nbsp;F[i][j]表示i位数中，数字之和为j的数的个数，F[i][j] = F[i - 1][k];&nbsp; (k = j....j-9 &amp;&amp; k &gt; 0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 递推方程由：F[i][j] = F[i - 1][j]个数尾部补0 + F[i - 1][j - k]个数头部补k，(k = 1...9, &amp;&amp; j - k &gt; 0)，而来。<br />Code:<br />
<p>#include&lt;cstdio&gt;</p>
<p>int F[10][82];<br />int count[82];</p>
<p>void init(){<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;int j = 0;<br />&nbsp;&nbsp;&nbsp;int k = 0;<br />&nbsp;&nbsp;&nbsp;count[0] = 1;<br />&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; 10; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 0; j &lt; 82; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[i][j] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;for(i = 0; i &lt;= 9; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[1][i] = 1;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;for(i = 2; i &lt; 10; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 1; j &lt; 82; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(k = j; k &gt; 0 &amp;&amp; k &gt;= j - 9; k--){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[i][j] += F[i - 1][k];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;count[1] = 10;<br />&nbsp;&nbsp;&nbsp;for(j = 2; j &lt; 82; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count[j] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt; 10; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count[j] += F[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />}</p>
<p>int main(int argc, char* argv[], char* env[])<br />{<br />&nbsp;&nbsp;&nbsp;int n = 0;<br />&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;while(scanf("%d", &amp;n) != EOF){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n", count[n]);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return 0;<br />}<br /></p> <img src ="http://www.cppblog.com/lshain/aggbug/151543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-07-21 14:11 <a href="http://www.cppblog.com/lshain/articles/151543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Timus 1260 Nudnik Photographer （题解 + 递推）</title><link>http://www.cppblog.com/lshain/articles/151495.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Wed, 20 Jul 2011 09:51:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/151495.html</guid><wfw:comment>http://www.cppblog.com/lshain/comments/151495.html</wfw:comment><comments>http://www.cppblog.com/lshain/articles/151495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshain/comments/commentRss/151495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshain/services/trackbacks/151495.html</trackback:ping><description><![CDATA[<div><a href="http://acm.timus.ru/problem.aspx?space=1&amp;num=1260">http://acm.timus.ru/problem.aspx?space=1&amp;num=1260</a><br /><br />思路：假设F[n]表示n个数的满足题意的合法排列数，那么F[n] = F[n - 1] + F[n -3] + 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[n - 1] 是这样来的：F[n]，1排第一，第2个位置只能排2,3. 假设第2个位置排2 那么序列就是12..... =&nbsp;1, (2....)序列。2.... =&nbsp; F[n - 1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[n - 3] + 1 是这样来的：F[n]，1排第一，第2个位置只能排2,3. 假设第2个位置排3&nbsp;那么序列就是13 ..... =&nbsp;13(....)2或者132(....)序列。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13(....)2只能有一种，因为4只能排2前面， 5只能排3后面。。。。&nbsp; 就如这样：13 5764 2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;132(....)&nbsp; = 132(4......)，(4....) = F[n-3];<br />Code:<br />
<p>#include&lt;cstdio&gt;</p>
<p>int F[56];<br />void init(){<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;F[0] = 0;<br />&nbsp;&nbsp;&nbsp;F[1] = 1;<br />&nbsp;&nbsp;&nbsp;F[2] = 1;<br />&nbsp;&nbsp;&nbsp;for(i = 3; i &lt;= 55; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F[i] = F[i - 1] + F[i - 3] + 1;<br />&nbsp;&nbsp;&nbsp;}<br />}</p>
<p>int main(int argc, char* argv[], char* env[])<br />{<br />&nbsp;&nbsp;&nbsp;int n = 0;<br />&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;while(scanf("%d", &amp;n) != EOF){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n", F[n]);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return 0;<br />}<br /></p></div><img src ="http://www.cppblog.com/lshain/aggbug/151495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-07-20 17:51 <a href="http://www.cppblog.com/lshain/articles/151495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Timus 1078. Segments (spfa（最长路）)</title><link>http://www.cppblog.com/lshain/articles/151458.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Wed, 20 Jul 2011 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/151458.html</guid><wfw:comment>http://www.cppblog.com/lshain/comments/151458.html</wfw:comment><comments>http://www.cppblog.com/lshain/articles/151458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshain/comments/commentRss/151458.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshain/services/trackbacks/151458.html</trackback:ping><description><![CDATA[<a href="http://acm.timus.ru/problem.aspx?space=1&amp;num=1078">http://acm.timus.ru/problem.aspx?space=1&amp;num=1078</a><br /><br />主要思路：i包含j连一有向边i-&gt;j，这样问题就变成了给一个有向无环图(DAG)，求其最长路，直接spfa就OK啦！<br /><br />Code<br />#include&lt;cstdio&gt; 
<p>#define MAXN&nbsp;501</p>
<p>int graph[MAXN][MAXN];<br />int rd[MAXN];<br />int dist[MAXN];<br />int pre[MAXN];<br />int mark[MAXN];<br />int seg[MAXN][2];<br />int maxLen;<br />int n;</p>
<p>int isContains(int I, int J){<br />&nbsp;&nbsp;&nbsp;int reVal = 0;<br />&nbsp;&nbsp;&nbsp;if(seg[I][0] &lt; seg[J][0] &amp;&amp; seg[I][1] &gt; seg[J][1]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reVal = 1;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;if(seg[J][0] &lt; seg[I][0] &amp;&amp; seg[J][1] &gt; seg[I][1]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reVal = -1;<br />&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;return reVal;<br />}</p>
<p>void spfa(){<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;int I = 0;<br />&nbsp;&nbsp;&nbsp;int t = 0;<br />&nbsp;&nbsp;&nbsp;int qHead = 0;<br />&nbsp;&nbsp;&nbsp;int qTail = 0;<br />&nbsp;&nbsp;&nbsp;int Q[MAXN] = {0};</p>
<p style="margin-right: 0px" dir="ltr">&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark[i] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre[i] = -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[i] = -MAXN;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!rd[i]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[qHead++] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark[i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;do{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qHead--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(qHead &lt; 0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qHead = n - 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I = Q[qHead];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark[I] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(graph[I][i] &amp;&amp; dist[I] + 1 &gt; dist[i]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre[i] = I;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[i] = dist[I] + 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!mark[i]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mark[i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = qHead - 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(t &lt; 0)t = n - 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(qHead != qTail&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp; dist[i] &lt; dist[Q[t]]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[qHead++] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(qHead &gt;= n){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qHead = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qTail--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(qTail &lt; 0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qTail = n - 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[qTail] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;}while(qHead != qTail);</p>
<p>&nbsp;&nbsp;&nbsp;maxLen = -1;<br />&nbsp;&nbsp;&nbsp;for(i = 0, I = -1; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(dist[i] &gt; maxLen){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxLen = dist[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;printf("%d\n", maxLen);<br />&nbsp;&nbsp;&nbsp;t = I;<br />&nbsp;&nbsp;&nbsp;i = 0;<br />&nbsp;&nbsp;&nbsp;while(t != -1){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(" ");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d", t + 1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = pre[t];<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;printf("\n");<br />}<br /></p>
<p>int main(int argc, char* argv[], char* env[])<br />{<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;int j = 0;<br />&nbsp;&nbsp;&nbsp;int t = 0;<br />&nbsp;&nbsp;&nbsp;while(scanf("%d", &amp;n) != EOF){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d", &amp;seg[i][0], &amp;seg[i][1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd[i] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graph[i][i] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = i + 1; j &lt; n; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = isContains(i, j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graph[i][j] = t &gt; 0 ? 1 : 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;graph[j][i] = t &lt; 0 ? 1 : 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 0; j &lt; n; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd[j] += graph[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spfa();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return 0;<br />}<br /></p><img src ="http://www.cppblog.com/lshain/aggbug/151458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-07-20 10:59 <a href="http://www.cppblog.com/lshain/articles/151458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最大连续子段和 + 最大子矩阵和</title><link>http://www.cppblog.com/lshain/articles/151440.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Wed, 20 Jul 2011 00:58:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/151440.html</guid><wfw:comment>http://www.cppblog.com/lshain/comments/151440.html</wfw:comment><comments>http://www.cppblog.com/lshain/articles/151440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshain/comments/commentRss/151440.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshain/services/trackbacks/151440.html</trackback:ping><description><![CDATA[<p>#include&lt;cstdio&gt;</p>
<p>int numberMatrix[101][101];<br />int subNumberSum[101][101];<br />int numbers[101];<br />int n;</p>
<p>int maxSubSum(int* numbers, int n){//计算最大子序列和<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int sum = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int maxSum = numbers[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum += numbers[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(sum &gt; maxSum){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxSum = sum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(sum &lt; 0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return maxSum;<br />}<br /></p>
<p>int maxSubMatrixSum(int numberMatrix[101][101], int n){//计算最优子矩阵<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int j = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int k = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int tempSum = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int maxSum = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt;= n; i++){//初始化第零行，全为0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subNumberSum[0][i] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt;= n; i++){//计算subNumberSum<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 1; j &lt;= n; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subNumberSum[i][j] = subNumberSum[i - 1][j] + numberMatrix[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxSum = subNumberSum[1][1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = n; i &gt;= 1; i--){//枚举计算maxSubSum<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = i - 1; j &gt;= 0; j--){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(k = 1; k &lt;= n; k++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numbers[k - 1] = subNumberSum[i][k] - subNumberSum[j][k];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempSum = maxSubSum(numbers, n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tempSum &gt; maxSum){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxSum = tempSum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return maxSum;<br />}<br /><br /></p>
<p>int main(int argc, char* argv[], char* env[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int j = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(scanf("%d", &amp;n) != EOF){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt;= n; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j = 1; j &lt;= n; j++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d", &amp;numberMatrix[i][j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n", maxSubMatrixSum(numberMatrix, n));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />}<br /></p> <img src ="http://www.cppblog.com/lshain/aggbug/151440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-07-20 08:58 <a href="http://www.cppblog.com/lshain/articles/151440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dij+heap  |  spfa + slf</title><link>http://www.cppblog.com/lshain/articles/151365.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Tue, 19 Jul 2011 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/151365.html</guid><wfw:comment>http://www.cppblog.com/lshain/comments/151365.html</wfw:comment><comments>http://www.cppblog.com/lshain/articles/151365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshain/comments/commentRss/151365.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshain/services/trackbacks/151365.html</trackback:ping><description><![CDATA[<p align="center"><font color="#333399" size="4">Source Code</font></p>
<table style="font-size: 10pt" align="center">
<tbody>
<tr>
<td><strong>Problem:</strong> <a href="http://poj.org/problem?id=1511"><font color="#002c99">1511</font></a></td>
<td width="10"><font color="#002c99"></font></td>
<td><strong>User:</strong> <a href="http://poj.org/userstatus?user_id=LUCKLY"><font color="#002c99">LUCKLY</font></a></td></tr>
<tr>
<td><strong>Memory:</strong> 51100K</td>
<td width="10"></td>
<td><strong>Time:</strong> 6266MS</td></tr>
<tr>
<td><strong>Language:</strong> C++</td>
<td width="10"></td>
<td><strong>Result:</strong> <font color="blue">Accepted</font></td></tr></tbody></table>
<ul><li><font color="#333399" size="5">Source Code</font> <pre style="font-family: Courier New,Courier,monospace" class="sh_cpp sh_sourceCode"><span class="sh_preproc">#include</span><span class="sh_string">&lt;cstdio&gt;</span>

<span class="sh_preproc">#define</span> <span class="sh_function">MAXINT	</span><span class="sh_symbol">(((</span><span class="sh_type">long</span> <span class="sh_type">long</span><span class="sh_symbol">)</span><span class="sh_number">1</span><span class="sh_symbol">)&lt;&lt;</span><span class="sh_number">60</span><span class="sh_symbol">)</span>
<span class="sh_preproc">#define</span> <span class="sh_function">SWAP</span><span class="sh_symbol">(</span>x<span class="sh_symbol">,</span> y<span class="sh_symbol">)</span> <span class="sh_keyword">do</span><span class="sh_cbracket">{</span> <span class="sh_keyword">if</span><span class="sh_symbol">((</span>x<span class="sh_symbol">)!=(</span>y<span class="sh_symbol">))</span><span class="sh_cbracket">{</span><span class="sh_symbol">(</span>x<span class="sh_symbol">)^=(</span>y<span class="sh_symbol">);</span> <span class="sh_symbol">(</span>y<span class="sh_symbol">)^=(</span>x<span class="sh_symbol">);</span> <span class="sh_symbol">(</span>x<span class="sh_symbol">)^=(</span>y<span class="sh_symbol">);</span><span class="sh_cbracket">}}</span><span class="sh_keyword">while</span><span class="sh_symbol">(</span><span class="sh_number">0</span><span class="sh_symbol">);</span>
<span class="sh_preproc">#define</span>	MAXM	<span class="sh_number">1000001</span>
<span class="sh_preproc">#define</span> MAXN	<span class="sh_number">1000001</span>

<span class="sh_keyword">struct</span><span class="sh_normal"> </span><span class="sh_classname">Edg</span><span class="sh_cbracket">{</span>
	<span class="sh_type">int</span> n<span class="sh_symbol">;</span>
	<span class="sh_type">int</span> p<span class="sh_symbol">;</span>
	<span class="sh_type">int</span> next<span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>EE<span class="sh_symbol">[</span>MAXM<span class="sh_symbol">&lt;&lt;</span><span class="sh_number">2</span><span class="sh_symbol">];</span>

<span class="sh_type">int</span> head1<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>
<span class="sh_type">int</span> head2<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>
<span class="sh_type">long</span> <span class="sh_type">long</span> dist<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>
<span class="sh_type">long</span> <span class="sh_type">long</span> ans<span class="sh_symbol">;</span>
<span class="sh_type">int</span> top<span class="sh_symbol">;</span>
<span class="sh_type">int</span> n<span class="sh_symbol">;</span>
<span class="sh_type">int</span> m<span class="sh_symbol">;</span>

<span class="sh_type">long</span> <span class="sh_type">long</span> heap<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>
<span class="sh_type">int</span> heap_size<span class="sh_symbol">;</span>
<span class="sh_type">int</span> id<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>

<span class="sh_type">void</span> <span class="sh_function">swim</span><span class="sh_symbol">(</span><span class="sh_type">int</span> u<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
	<span class="sh_type">int</span> parent <span class="sh_symbol">=</span> u <span class="sh_symbol">&gt;&gt;</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">while</span><span class="sh_symbol">(</span>parent <span class="sh_symbol">&gt;</span> <span class="sh_number">0</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		<span class="sh_keyword">if</span><span class="sh_symbol">(</span>dist<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>u<span class="sh_symbol">]]</span> <span class="sh_symbol">&lt;</span> dist<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>parent<span class="sh_symbol">]])</span><span class="sh_cbracket">{</span>
			<span class="sh_function">SWAP</span><span class="sh_symbol">(</span>id<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>parent<span class="sh_symbol">]],</span> id<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>u<span class="sh_symbol">]]);</span>
			<span class="sh_function">SWAP</span><span class="sh_symbol">(</span>heap<span class="sh_symbol">[</span>parent<span class="sh_symbol">],</span> heap<span class="sh_symbol">[</span>u<span class="sh_symbol">]);</span>
			u <span class="sh_symbol">=</span> parent<span class="sh_symbol">;</span>
			parent <span class="sh_symbol">=</span> u <span class="sh_symbol">&gt;&gt;</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
		<span class="sh_cbracket">}</span>
		<span class="sh_keyword">else</span><span class="sh_cbracket">{</span>
			<span class="sh_keyword">break</span><span class="sh_symbol">;</span>
		<span class="sh_cbracket">}</span>
	<span class="sh_cbracket">}</span>
<span class="sh_cbracket">}</span>

<span class="sh_type">void</span> <span class="sh_function">sink</span><span class="sh_symbol">(</span><span class="sh_type">int</span> u<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
	<span class="sh_type">int</span> child <span class="sh_symbol">=</span> u <span class="sh_symbol">&lt;&lt;</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">while</span><span class="sh_symbol">(</span>child <span class="sh_symbol">&lt;</span> heap_size<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		<span class="sh_keyword">if</span><span class="sh_symbol">(</span>child <span class="sh_symbol">+</span> <span class="sh_number">1</span> <span class="sh_symbol">&lt;</span> heap_size <span class="sh_symbol">&amp;&amp;</span> dist<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>child<span class="sh_symbol">]]</span> <span class="sh_symbol">&lt;</span> dist<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>child <span class="sh_symbol">+</span> <span class="sh_number">1</span><span class="sh_symbol">]])</span><span class="sh_cbracket">{</span>
			child<span class="sh_symbol">++;</span>
		<span class="sh_cbracket">}</span>
		<span class="sh_keyword">if</span><span class="sh_symbol">(</span>dist<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>child<span class="sh_symbol">]]</span> <span class="sh_symbol">&lt;</span> dist<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>u<span class="sh_symbol">]])</span><span class="sh_cbracket">{</span>
			<span class="sh_function">SWAP</span><span class="sh_symbol">(</span>id<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>child<span class="sh_symbol">]],</span> id<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>u<span class="sh_symbol">]]);</span>
			<span class="sh_function">SWAP</span><span class="sh_symbol">(</span>heap<span class="sh_symbol">[</span>child<span class="sh_symbol">],</span> heap<span class="sh_symbol">[</span>u<span class="sh_symbol">]);</span>
			u <span class="sh_symbol">=</span> child<span class="sh_symbol">;</span>
			child <span class="sh_symbol">=</span> u <span class="sh_symbol">&lt;&lt;</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
		<span class="sh_cbracket">}</span>
		<span class="sh_keyword">else</span><span class="sh_cbracket">{</span>
			<span class="sh_keyword">break</span><span class="sh_symbol">;</span>
		<span class="sh_cbracket">}</span>
	<span class="sh_cbracket">}</span>
<span class="sh_cbracket">}</span>

<span class="sh_type">int</span> <span class="sh_function">getMin</span><span class="sh_symbol">()</span><span class="sh_cbracket">{</span>
	<span class="sh_type">int</span> reVal <span class="sh_symbol">=</span> <span class="sh_symbol">-</span><span class="sh_number">1</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">if</span><span class="sh_symbol">(</span>heap_size <span class="sh_symbol">&gt;</span> <span class="sh_number">1</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		reVal <span class="sh_symbol">=</span> heap<span class="sh_symbol">[</span><span class="sh_number">1</span><span class="sh_symbol">];</span>
		heap_size<span class="sh_symbol">--;</span>
		<span class="sh_keyword">if</span><span class="sh_symbol">(</span>heap_size <span class="sh_symbol">&gt;</span> <span class="sh_number">1</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
			<span class="sh_function">SWAP</span><span class="sh_symbol">(</span>id<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span><span class="sh_number">1</span><span class="sh_symbol">]],</span> id<span class="sh_symbol">[</span>heap<span class="sh_symbol">[</span>heap_size<span class="sh_symbol">]]);</span>
			<span class="sh_function">SWAP</span><span class="sh_symbol">(</span>heap<span class="sh_symbol">[</span><span class="sh_number">1</span><span class="sh_symbol">],</span> heap<span class="sh_symbol">[</span>heap_size<span class="sh_symbol">]);</span>
			<span class="sh_function">sink</span><span class="sh_symbol">(</span><span class="sh_number">1</span><span class="sh_symbol">);</span>
		<span class="sh_cbracket">}</span>
	<span class="sh_cbracket">}</span>
	<span class="sh_keyword">return</span> reVal<span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>

<span class="sh_keyword">inline</span> <span class="sh_type">int</span> <span class="sh_function">nextInt</span><span class="sh_symbol">()</span><span class="sh_cbracket">{</span>
	<span class="sh_type">char</span> ch <span class="sh_symbol">=</span> <span class="sh_function">getchar</span><span class="sh_symbol">();</span>
	<span class="sh_type">int</span> x <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">while</span><span class="sh_symbol">(</span>ch <span class="sh_symbol">&lt;</span> <span class="sh_string">'0'</span> <span class="sh_symbol">||</span> ch <span class="sh_symbol">&gt;</span> <span class="sh_string">'9'</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		ch <span class="sh_symbol">=</span> <span class="sh_function">getchar</span><span class="sh_symbol">();</span>
	<span class="sh_cbracket">}</span>
	<span class="sh_keyword">while</span><span class="sh_symbol">(</span>ch <span class="sh_symbol">&gt;=</span> <span class="sh_string">'0'</span> <span class="sh_symbol">&amp;&amp;</span> ch <span class="sh_symbol">&lt;=</span> <span class="sh_string">'9'</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		x <span class="sh_symbol">=</span> x <span class="sh_symbol">*</span> <span class="sh_number">10</span> <span class="sh_symbol">+</span> ch <span class="sh_symbol">-</span> <span class="sh_number">48</span><span class="sh_symbol">;</span>
		ch <span class="sh_symbol">=</span> <span class="sh_function">getchar</span><span class="sh_symbol">();</span>
	<span class="sh_cbracket">}</span>
	<span class="sh_keyword">return</span> x<span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>

<span class="sh_type">void</span> <span class="sh_function">dij</span><span class="sh_symbol">(</span><span class="sh_type">int</span><span class="sh_symbol">*</span> head<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
	<span class="sh_type">int</span> i <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> minP <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> I <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">for</span><span class="sh_symbol">(</span>i <span class="sh_symbol">=</span> <span class="sh_number">1</span><span class="sh_symbol">;</span> i <span class="sh_symbol">&lt;=</span> n<span class="sh_symbol">;</span> i<span class="sh_symbol">++)</span><span class="sh_cbracket">{</span>
		dist<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> MAXINT<span class="sh_symbol">;</span>
		heap<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> i<span class="sh_symbol">;</span>
		id<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> i<span class="sh_symbol">;</span>
	<span class="sh_cbracket">}</span>
	dist<span class="sh_symbol">[</span><span class="sh_number">1</span><span class="sh_symbol">]</span> <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	heap_size <span class="sh_symbol">=</span> n <span class="sh_symbol">+</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">while</span><span class="sh_symbol">((</span>I <span class="sh_symbol">=</span> <span class="sh_function">getMin</span><span class="sh_symbol">())</span> <span class="sh_symbol">!=</span> <span class="sh_symbol">-</span><span class="sh_number">1</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		minP <span class="sh_symbol">=</span> dist<span class="sh_symbol">[</span>I<span class="sh_symbol">];</span>
		i <span class="sh_symbol">=</span> head<span class="sh_symbol">[</span>I<span class="sh_symbol">];</span>
		<span class="sh_keyword">while</span><span class="sh_symbol">(</span>i <span class="sh_symbol">!=</span> <span class="sh_symbol">-</span><span class="sh_number">1</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
			I <span class="sh_symbol">=</span> EE<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>n<span class="sh_symbol">;</span>
			<span class="sh_keyword">if</span><span class="sh_symbol">(</span>minP <span class="sh_symbol">+</span> EE<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>p <span class="sh_symbol">&lt;</span> dist<span class="sh_symbol">[</span>I<span class="sh_symbol">])</span><span class="sh_cbracket">{</span>
				dist<span class="sh_symbol">[</span>I<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> minP <span class="sh_symbol">+</span> EE<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>p<span class="sh_symbol">;</span>
				<span class="sh_function">swim</span><span class="sh_symbol">(</span>id<span class="sh_symbol">[</span>I<span class="sh_symbol">]);</span>
			<span class="sh_cbracket">}</span>
			i <span class="sh_symbol">=</span> EE<span class="sh_symbol">[</span>i<span class="sh_symbol">].</span>next<span class="sh_symbol">;</span>
		<span class="sh_cbracket">}</span>
	<span class="sh_cbracket">}</span>
	<span class="sh_keyword">for</span><span class="sh_symbol">(</span>i <span class="sh_symbol">=</span> <span class="sh_number">1</span><span class="sh_symbol">;</span> i <span class="sh_symbol">&lt;=</span> n<span class="sh_symbol">;</span> i<span class="sh_symbol">++)</span><span class="sh_cbracket">{</span>
		ans <span class="sh_symbol">+=</span> dist<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>
	<span class="sh_cbracket">}</span>
<span class="sh_cbracket">}</span>

<span class="sh_type">void</span> <span class="sh_function">buildEdg</span><span class="sh_symbol">(</span><span class="sh_type">int</span> I<span class="sh_symbol">,</span> <span class="sh_type">int</span> J<span class="sh_symbol">,</span> <span class="sh_type">int</span> p<span class="sh_symbol">,</span> <span class="sh_type">int</span><span class="sh_symbol">*</span> head<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
	EE<span class="sh_symbol">[</span>top<span class="sh_symbol">].</span>n <span class="sh_symbol">=</span> J<span class="sh_symbol">;</span>
	EE<span class="sh_symbol">[</span>top<span class="sh_symbol">].</span>p <span class="sh_symbol">=</span> p<span class="sh_symbol">;</span>
	EE<span class="sh_symbol">[</span>top<span class="sh_symbol">].</span>next <span class="sh_symbol">=</span> head<span class="sh_symbol">[</span>I<span class="sh_symbol">];</span>
	head<span class="sh_symbol">[</span>I<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> top<span class="sh_symbol">++;</span>
<span class="sh_cbracket">}</span>

<span class="sh_type">int</span> <span class="sh_function">main</span><span class="sh_symbol">(</span><span class="sh_type">int</span> argc<span class="sh_symbol">,</span> <span class="sh_type">char</span><span class="sh_symbol">*</span> argv<span class="sh_symbol">[],</span> <span class="sh_type">char</span><span class="sh_symbol">*</span> env<span class="sh_symbol">[])</span>
<span class="sh_cbracket">{</span>
	<span class="sh_type">int</span> i <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> I <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> J <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> P <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> caseNum <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">while</span><span class="sh_symbol">(</span><span class="sh_function">scanf</span><span class="sh_symbol">(</span><span class="sh_string">"%d"</span><span class="sh_symbol">,</span> <span class="sh_symbol">&amp;</span>caseNum<span class="sh_symbol">)</span> <span class="sh_symbol">!=</span> EOF<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		<span class="sh_keyword">while</span><span class="sh_symbol">(</span>caseNum<span class="sh_symbol">--</span> <span class="sh_symbol">&gt;</span> <span class="sh_number">0</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
			n <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>
			m <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>
			top <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
			<span class="sh_keyword">for</span><span class="sh_symbol">(</span>i <span class="sh_symbol">=</span> <span class="sh_number">1</span><span class="sh_symbol">;</span> i <span class="sh_symbol">&lt;=</span> n<span class="sh_symbol">;</span> i<span class="sh_symbol">++)</span><span class="sh_cbracket">{</span>
				head1<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> head2<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> <span class="sh_symbol">-</span><span class="sh_number">1</span><span class="sh_symbol">;</span>
			<span class="sh_cbracket">}</span>
			<span class="sh_keyword">while</span><span class="sh_symbol">(</span>m<span class="sh_symbol">--</span> <span class="sh_symbol">&gt;</span> <span class="sh_number">0</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
				I <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>	
				J <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>
				P <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>
				<span class="sh_function">buildEdg</span><span class="sh_symbol">(</span>I<span class="sh_symbol">,</span> J<span class="sh_symbol">,</span> P<span class="sh_symbol">,</span> head1<span class="sh_symbol">);</span>
				<span class="sh_function">buildEdg</span><span class="sh_symbol">(</span>J<span class="sh_symbol">,</span> I<span class="sh_symbol">,</span> P<span class="sh_symbol">,</span> head2<span class="sh_symbol">);</span>
			<span class="sh_cbracket">}</span>
			ans <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
			<span class="sh_function">dij</span><span class="sh_symbol">(</span>head1<span class="sh_symbol">);</span>
			<span class="sh_function">dij</span><span class="sh_symbol">(</span>head2<span class="sh_symbol">);</span>
			<span class="sh_function">printf</span><span class="sh_symbol">(</span><span class="sh_string">"%lld</span><span class="sh_specialchar">\n</span><span class="sh_string">"</span><span class="sh_symbol">,</span> ans<span class="sh_symbol">);</span>
		<span class="sh_cbracket">}</span>
	<span class="sh_cbracket">}</span>
	<span class="sh_keyword">return</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>
</pre></li></ul><br />
<p align="center"><font color="#333399" size="4">Source Code</font></p>
<table style="font-size: 10pt" align="center">
<tbody>
<tr>
<td><strong>Problem:</strong> <a href="http://poj.org/problem?id=1511">1511</a></td>
<td width="10"></td>
<td><strong>User:</strong> <a href="http://poj.org/userstatus?user_id=LUCKLY">LUCKLY</a></td></tr>
<tr>
<td><strong>Memory:</strong> 47188K</td>
<td width="10"></td>
<td><strong>Time:</strong> 3688MS</td></tr>
<tr>
<td><strong>Language:</strong> C++</td>
<td width="10"></td>
<td><strong>Result:</strong> <font color="blue">Accepted</font></td></tr></tbody></table>
<ul><li><font color="#333399" size="5">Source Code</font> <pre style="font-family: Courier New,Courier,monospace" class="sh_cpp sh_sourceCode"><span class="sh_preproc">#include</span><span class="sh_string">&lt;cstdio&gt;</span>

<span class="sh_preproc">#define</span> <span class="sh_function">MAXINT	</span><span class="sh_symbol">(((</span><span class="sh_type">long</span> <span class="sh_type">long</span><span class="sh_symbol">)</span><span class="sh_number">1</span><span class="sh_symbol">)&lt;&lt;</span><span class="sh_number">60</span><span class="sh_symbol">)</span>
<span class="sh_preproc">#define</span>	MAXM	<span class="sh_number">1000001</span>
<span class="sh_preproc">#define</span> MAXN	<span class="sh_number">1000001</span>

<span class="sh_keyword">struct</span><span class="sh_normal"> </span><span class="sh_classname">Edg</span><span class="sh_cbracket">{</span>
	<span class="sh_type">int</span> n<span class="sh_symbol">;</span>
	<span class="sh_type">int</span> p<span class="sh_symbol">;</span>
	<span class="sh_type">int</span> next<span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>EE<span class="sh_symbol">[</span>MAXM<span class="sh_symbol">&lt;&lt;</span><span class="sh_number">2</span><span class="sh_symbol">];</span>

<span class="sh_type">int</span> head1<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>
<span class="sh_type">int</span> head2<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>
<span class="sh_type">long</span> <span class="sh_type">long</span> dist<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>
<span class="sh_type">int</span> spfa_que<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>
<span class="sh_type">int</span> mark<span class="sh_symbol">[</span>MAXN<span class="sh_symbol">];</span>
<span class="sh_type">long</span> <span class="sh_type">long</span> ans<span class="sh_symbol">;</span>
<span class="sh_type">int</span> top<span class="sh_symbol">;</span>
<span class="sh_type">int</span> spfa_que_head<span class="sh_symbol">;</span>
<span class="sh_type">int</span> spfa_que_tail<span class="sh_symbol">;</span>
<span class="sh_type">int</span> n<span class="sh_symbol">;</span>
<span class="sh_type">int</span> m<span class="sh_symbol">;</span>

<span class="sh_keyword">inline</span> <span class="sh_type">int</span> <span class="sh_function">nextInt</span><span class="sh_symbol">()</span><span class="sh_cbracket">{</span>
	<span class="sh_type">char</span> ch <span class="sh_symbol">=</span> <span class="sh_function">getchar</span><span class="sh_symbol">();</span>
	<span class="sh_type">int</span> x <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">while</span><span class="sh_symbol">(</span>ch <span class="sh_symbol">&lt;</span> <span class="sh_string">'0'</span> <span class="sh_symbol">||</span> ch <span class="sh_symbol">&gt;</span> <span class="sh_string">'9'</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		ch <span class="sh_symbol">=</span> <span class="sh_function">getchar</span><span class="sh_symbol">();</span>
	<span class="sh_cbracket">}</span>
	<span class="sh_keyword">while</span><span class="sh_symbol">(</span>ch <span class="sh_symbol">&gt;=</span> <span class="sh_string">'0'</span> <span class="sh_symbol">&amp;&amp;</span> ch <span class="sh_symbol">&lt;=</span> <span class="sh_string">'9'</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		x <span class="sh_symbol">=</span> x <span class="sh_symbol">*</span> <span class="sh_number">10</span> <span class="sh_symbol">+</span> ch <span class="sh_symbol">-</span> <span class="sh_number">48</span><span class="sh_symbol">;</span>
		ch <span class="sh_symbol">=</span> <span class="sh_function">getchar</span><span class="sh_symbol">();</span>
	<span class="sh_cbracket">}</span>
	<span class="sh_keyword">return</span> x<span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>

<span class="sh_keyword">inline</span> <span class="sh_type">void</span> <span class="sh_function">buildEdg</span><span class="sh_symbol">(</span><span class="sh_type">int</span> I<span class="sh_symbol">,</span> <span class="sh_type">int</span> J<span class="sh_symbol">,</span> <span class="sh_type">int</span> p<span class="sh_symbol">,</span> <span class="sh_type">int</span><span class="sh_symbol">*</span> head<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
	EE<span class="sh_symbol">[</span>top<span class="sh_symbol">].</span>n <span class="sh_symbol">=</span> J<span class="sh_symbol">;</span>
	EE<span class="sh_symbol">[</span>top<span class="sh_symbol">].</span>p <span class="sh_symbol">=</span> p<span class="sh_symbol">;</span>
	EE<span class="sh_symbol">[</span>top<span class="sh_symbol">].</span>next <span class="sh_symbol">=</span> head<span class="sh_symbol">[</span>I<span class="sh_symbol">];</span>
	head<span class="sh_symbol">[</span>I<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> top<span class="sh_symbol">++;</span>
<span class="sh_cbracket">}</span>

<span class="sh_type">void</span> <span class="sh_function">spfa_slf</span><span class="sh_symbol">(</span><span class="sh_type">int</span><span class="sh_symbol">*</span> head<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
	<span class="sh_type">int</span> i <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> I <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> q <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int t = 0;
	<span class="sh_keyword">for</span><span class="sh_symbol">(</span>i <span class="sh_symbol">=</span> <span class="sh_number">1</span><span class="sh_symbol">;</span> i <span class="sh_symbol">&lt;=</span> n<span class="sh_symbol">;</span> i<span class="sh_symbol">++)</span><span class="sh_cbracket">{</span>
		dist<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> MAXINT<span class="sh_symbol">;</span>
		mark<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_cbracket">}</span>
	dist<span class="sh_symbol">[</span><span class="sh_number">1</span><span class="sh_symbol">]</span> <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	spfa_que_head <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	spfa_que_tail <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	spfa_que<span class="sh_symbol">[</span>spfa_que_head<span class="sh_symbol">++]</span> <span class="sh_symbol">=</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
	mark<span class="sh_symbol">[</span><span class="sh_number">1</span><span class="sh_symbol">]</span> <span class="sh_symbol">=</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">do</span><span class="sh_cbracket">{</span>
		spfa_que_head<span class="sh_symbol">--;</span>
		<span class="sh_keyword">if</span><span class="sh_symbol">(</span>spfa_que_head <span class="sh_symbol">&lt;</span> <span class="sh_number">0</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
			spfa_que_head <span class="sh_symbol">=</span> n <span class="sh_symbol">-</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
		<span class="sh_cbracket">}</span>
		I <span class="sh_symbol">=</span> spfa_que<span class="sh_symbol">[</span>spfa_que_head<span class="sh_symbol">];</span>
		mark<span class="sh_symbol">[</span>I<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
		q <span class="sh_symbol">=</span> head<span class="sh_symbol">[</span>I<span class="sh_symbol">];</span>
		<span class="sh_keyword">while</span><span class="sh_symbol">(</span>q <span class="sh_symbol">!=</span> <span class="sh_symbol">-</span><span class="sh_number">1</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
			i <span class="sh_symbol">=</span> EE<span class="sh_symbol">[</span>q<span class="sh_symbol">].</span>n<span class="sh_symbol">;</span>
			<span class="sh_keyword">if</span><span class="sh_symbol">(</span>dist<span class="sh_symbol">[</span>I<span class="sh_symbol">]</span> <span class="sh_symbol">+</span> EE<span class="sh_symbol">[</span>q<span class="sh_symbol">].</span>p <span class="sh_symbol">&lt;</span> dist<span class="sh_symbol">[</span>i<span class="sh_symbol">])</span><span class="sh_cbracket">{</span>
				dist<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> dist<span class="sh_symbol">[</span>I<span class="sh_symbol">]</span> <span class="sh_symbol">+</span> EE<span class="sh_symbol">[</span>q<span class="sh_symbol">].</span>p<span class="sh_symbol">;</span>
				<span class="sh_keyword">if</span><span class="sh_symbol">(!</span>mark<span class="sh_symbol">[</span>i<span class="sh_symbol">])</span><span class="sh_cbracket">{</span>
					mark<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> <span class="sh_number">1</span><span class="sh_symbol">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t = spfa_que_head <span class="sh_symbol">-</span> <span class="sh_number">1</span>;<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(t &lt; 0)t = n - 1;
					<span class="sh_keyword">if</span><span class="sh_symbol">(</span>spfa_que_head <span class="sh_symbol">!=</span> spfa_que_tail 
						<span class="sh_symbol">&amp;&amp;</span> dist<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">&lt;</span> dist<span class="sh_symbol">[</span>spfa_que<span class="sh_symbol">[</span>t<span class="sh_symbol">]])</span><span class="sh_cbracket">{</span>
						spfa_que<span class="sh_symbol">[</span>spfa_que_head<span class="sh_symbol">++]</span> <span class="sh_symbol">=</span> i<span class="sh_symbol">;</span>
						<span class="sh_keyword">if</span><span class="sh_symbol">(</span>spfa_que_head <span class="sh_symbol">&gt;=</span> n<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
							spfa_que_head <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
						<span class="sh_cbracket">}</span>
					<span class="sh_cbracket">}</span>
					<span class="sh_keyword">else</span><span class="sh_cbracket">{</span>
						spfa_que_tail<span class="sh_symbol">--;</span>
						<span class="sh_keyword">if</span><span class="sh_symbol">(</span>spfa_que_tail <span class="sh_symbol">&lt;</span> <span class="sh_number">0</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
							spfa_que_tail <span class="sh_symbol">=</span> n <span class="sh_symbol">-</span> <span class="sh_number">1</span><span class="sh_symbol">;</span>
						<span class="sh_cbracket">}</span>
						spfa_que<span class="sh_symbol">[</span>spfa_que_tail<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> i<span class="sh_symbol">;</span>
					<span class="sh_cbracket">}</span>
				<span class="sh_cbracket">}</span>
			<span class="sh_cbracket">}</span>
			q <span class="sh_symbol">=</span> EE<span class="sh_symbol">[</span>q<span class="sh_symbol">].</span>next<span class="sh_symbol">;</span>
		<span class="sh_cbracket">}</span>
	<span class="sh_cbracket">}</span><span class="sh_keyword">while</span><span class="sh_symbol">(</span>spfa_que_head <span class="sh_symbol">!=</span> spfa_que_tail<span class="sh_symbol">);</span>
	<span class="sh_keyword">for</span><span class="sh_symbol">(</span>i <span class="sh_symbol">=</span> <span class="sh_number">1</span><span class="sh_symbol">;</span> i <span class="sh_symbol">&lt;=</span> n<span class="sh_symbol">;</span> i<span class="sh_symbol">++)</span><span class="sh_cbracket">{</span>
		ans <span class="sh_symbol">+=</span> dist<span class="sh_symbol">[</span>i<span class="sh_symbol">];</span>
	<span class="sh_cbracket">}</span>
<span class="sh_cbracket">}</span>

<span class="sh_type">int</span> <span class="sh_function">main</span><span class="sh_symbol">(</span><span class="sh_type">int</span> argc<span class="sh_symbol">,</span> <span class="sh_type">char</span><span class="sh_symbol">*</span> argv<span class="sh_symbol">[],</span> <span class="sh_type">char</span><span class="sh_symbol">*</span> env<span class="sh_symbol">[])</span>
<span class="sh_cbracket">{</span>
	<span class="sh_type">int</span> i <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> I <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> J <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> P <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_type">int</span> caseNum <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
	<span class="sh_keyword">while</span><span class="sh_symbol">(</span><span class="sh_function">scanf</span><span class="sh_symbol">(</span><span class="sh_string">"%d"</span><span class="sh_symbol">,</span> <span class="sh_symbol">&amp;</span>caseNum<span class="sh_symbol">)</span> <span class="sh_symbol">!=</span> EOF<span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
		<span class="sh_keyword">while</span><span class="sh_symbol">(</span>caseNum<span class="sh_symbol">--</span> <span class="sh_symbol">&gt;</span> <span class="sh_number">0</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
			n <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>
			m <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>
			top <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
			<span class="sh_keyword">for</span><span class="sh_symbol">(</span>i <span class="sh_symbol">=</span> <span class="sh_number">1</span><span class="sh_symbol">;</span> i <span class="sh_symbol">&lt;=</span> n<span class="sh_symbol">;</span> i<span class="sh_symbol">++)</span><span class="sh_cbracket">{</span>
				head1<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> head2<span class="sh_symbol">[</span>i<span class="sh_symbol">]</span> <span class="sh_symbol">=</span> <span class="sh_symbol">-</span><span class="sh_number">1</span><span class="sh_symbol">;</span>
			<span class="sh_cbracket">}</span>
			<span class="sh_keyword">while</span><span class="sh_symbol">(</span>m<span class="sh_symbol">--</span> <span class="sh_symbol">&gt;</span> <span class="sh_number">0</span><span class="sh_symbol">)</span><span class="sh_cbracket">{</span>
				I <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>	
				J <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>
				P <span class="sh_symbol">=</span> <span class="sh_function">nextInt</span><span class="sh_symbol">();</span>
				<span class="sh_function">buildEdg</span><span class="sh_symbol">(</span>I<span class="sh_symbol">,</span> J<span class="sh_symbol">,</span> P<span class="sh_symbol">,</span> head1<span class="sh_symbol">);</span>
				<span class="sh_function">buildEdg</span><span class="sh_symbol">(</span>J<span class="sh_symbol">,</span> I<span class="sh_symbol">,</span> P<span class="sh_symbol">,</span> head2<span class="sh_symbol">);</span>
			<span class="sh_cbracket">}</span>
			ans <span class="sh_symbol">=</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
			<span class="sh_function">spfa_slf</span><span class="sh_symbol">(</span>head1<span class="sh_symbol">);</span>
			<span class="sh_function">spfa_slf</span><span class="sh_symbol">(</span>head2<span class="sh_symbol">);</span>
			<span class="sh_function">printf</span><span class="sh_symbol">(</span><span class="sh_string">"%lld</span><span class="sh_specialchar">\n</span><span class="sh_string">"</span><span class="sh_symbol">,</span> ans<span class="sh_symbol">);</span>
		<span class="sh_cbracket">}</span>
	<span class="sh_cbracket">}</span>
	<span class="sh_keyword">return</span> <span class="sh_number">0</span><span class="sh_symbol">;</span>
<span class="sh_cbracket">}</span>
</pre></li></ul><img src ="http://www.cppblog.com/lshain/aggbug/151365.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-07-19 10:53 <a href="http://www.cppblog.com/lshain/articles/151365.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图论专题 二分图(转)</title><link>http://www.cppblog.com/lshain/articles/151306.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Mon, 18 Jul 2011 06:20:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/151306.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自http://blog.163.com/zjut_nizhenyang/blog/static/169570029201011285564684/图论专题 二分图二分图：二分图是这样一个图，它的顶点可以分类两个集合X和Y，所有的边关联的两个顶点恰好一个属于集合X，另一个属于集合Y。二分图匹配：给定一个二分图G，在G的一个子图M中，M的边集中的任意两条边都不依附于同一个顶...&nbsp;&nbsp;<a href='http://www.cppblog.com/lshain/articles/151306.html'>阅读全文</a><img src ="http://www.cppblog.com/lshain/aggbug/151306.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-07-18 14:20 <a href="http://www.cppblog.com/lshain/articles/151306.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Timus 1056. Computer Net 树的中心</title><link>http://www.cppblog.com/lshain/articles/149049.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Mon, 20 Jun 2011 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/149049.html</guid><wfw:comment>http://www.cppblog.com/lshain/comments/149049.html</wfw:comment><comments>http://www.cppblog.com/lshain/articles/149049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshain/comments/commentRss/149049.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshain/services/trackbacks/149049.html</trackback:ping><description><![CDATA[<a href="http://acm.timus.ru/problem.aspx?space=1&amp;num=1056">http://acm.timus.ru/problem.aspx?space=1&amp;num=1056</a> 
<h2 class="problem_title">1056. Computer Net</h2>
<div class="problem_limits">Time Limit: 2.0 second<br />Memory Limit: 16 MB<br /></div>
<div id="problem_text">
<h3 class="problem_subtitle">Background</h3>
<div class="problem_par">
<div class="problem_par_normal">Computer net is created by consecutive computer plug-up to one that has already been connected to the net. Each new computer gets an ordinal number, but the protocol contains the number of its parent computer in the net. Thus, protocol consists of several numbers; the first of them is always 1, because the second computer can only be connected to the first one, the second number is 1 or 2 and so forth. The total quantity of numbers in the protocol is <em>N</em>&nbsp;&#8722;&nbsp;1 (<em>N</em> is a total number of computers). For instance, protocol 1, 1, 2, 2 corresponds to the following net: </div></div>
<div class="problem_par_pre">
<table border="0" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><pre class="intable">1 - 2 - 5
|   |
3   4
            </pre></td></tr></tbody></table></div>
<div class="problem_par">
<div class="problem_par_normal">The distance between the computers is the quantity of mutual connections (between each other) in chain. Thus, in example mentioned above the distance between computers #4 and #5 is 2, and between #3 and #5 is 3.</div></div>
<div class="problem_par">
<div class="problem_par_normal"><em>Definition.</em> Let the center of the net be the computer which has a minimal distance to the most remote computer. In the shown example computers #1 and #2 are the centers of the net.</div></div>
<h3 class="problem_subtitle">Problem</h3>
<div class="problem_par">
<div class="problem_par_normal">Your task is to find all the centers using the set protocol. </div></div>
<h3 class="problem_subtitle">Input</h3>
<div class="problem_par">
<div class="problem_par_normal">The first line of input contains an integer <em>N</em>, the quantity of computers (2&nbsp;&#8804;&nbsp;<em>N</em>&nbsp;&#8804;&nbsp;10000). Successive <em>N</em>&nbsp;&#8722;&nbsp;1 lines contain protocol. </div></div>
<h3 class="problem_subtitle">Output</h3>
<div class="problem_par">
<div class="problem_par_normal">Output should contain ordinal numbers of the determined net centers in ascending order.</div></div>
<h3 class="problem_subtitle">Sample</h3>
<table style="width: 542px; height: 108px" class="sample">
<colgroup>
<col width="350">
<col width="350">
<tbody>
<tr>
<th>input</th>
<th>output</th></tr>
<tr>
<td style="width: 247px; height: 78px"><pre class="intable">5
1
1
2
2</pre></td>
<td style="width: 352px"><pre class="intable">1 2
            </pre></td></tr></tbody></table>
<h3><span style="font-size: 10pt">给定一棵树，求该树的中心。</span><br /><span style="font-size: 10pt">中心定义：到其它点的距离最大值最小</span><br /><span style="font-size: 10pt">树的中心即为树中最长链的中心，2次dfs即可<br /><br />Code<br /></span><span style="font-size: 10pt">#include&lt;cstdio&gt;</span><cstdio><span style="font-size: 10pt"><br />struct Node{</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;int n;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;int next;</span><br /><span style="font-size: 10pt">}EE[20001];</span><br /><span style="font-size: 10pt"><br />int ind;</span><br /><span style="font-size: 10pt">int n;</span><br /><span style="font-size: 10pt">int top;</span><br /><span style="font-size: 10pt">int head[10001];</span><br /><span style="font-size: 10pt">int check[10001];</span><br /><span style="font-size: 10pt">int pre[10001];</span><br /><span style="font-size: 10pt">int maxDep;</span><br /><span style="font-size: 10pt">void dfs(int u, int t){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;int q;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;check[u] = 1;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;if(t &gt; maxDep){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxDep = t;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ind = u;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;q = head[u];</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;while(q != -1){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!check[EE[q].n]){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre[EE[q].n] = u;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(EE[q].n, t + 1);</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = EE[q].next;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">}</span><br /><span style="font-size: 10pt"><br />int main(int argc, char* argv[], char* env[])</span><br /><span style="font-size: 10pt">{</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;int i = 0;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;int j = 0;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;while(scanf("%d", &amp;n) != EOF){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt;= n; i++){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head[i] = -1;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check[i] = 0;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top = 0;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 2; i &lt;= n; i++){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d", &amp;j);</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EE[top].n = i;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EE[top].next = head[j];</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head[j] = top++;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EE[top].n = j;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EE[top].next = head[i];</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head[i] = top++;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxDep = -1;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(1, 1);</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt;= n; i++){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check[i] = 0;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre[i] = -1;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxDep = -1;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(ind, 1);</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = ind;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top = 0;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(i != -1){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check[top++] = i;</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = pre[i];</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(top&amp;1){</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n", check[top&gt;&gt;1]);</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d %d\n", check[(top&gt;&gt;1) - 1], check[top&gt;&gt;1]);</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;return 0;</span><br /><span style="font-size: 10pt">}<br />&nbsp;</span></h3></div> <img src ="http://www.cppblog.com/lshain/aggbug/149049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lshain/" target="_blank">Lshain</a> 2011-06-20 17:30 <a href="http://www.cppblog.com/lshain/articles/149049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>