﻿<?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++博客-心無雜念的空白-文章分类-题解-timus</title><link>http://www.cppblog.com/lshain/category/17303.html</link><description>Beyond this world...</description><language>zh-cn</language><lastBuildDate>Sat, 30 Jul 2011 17:52:17 GMT</lastBuildDate><pubDate>Sat, 30 Jul 2011 17:52: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>Timus 1280. Topological Sorting(题解 (拓扑排序))</title><link>http://www.cppblog.com/lshain/articles/150994.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Thu, 14 Jul 2011 09:16:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/150994.html</guid><wfw:comment>http://www.cppblog.com/lshain/comments/150994.html</wfw:comment><comments>http://www.cppblog.com/lshain/articles/150994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshain/comments/commentRss/150994.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshain/services/trackbacks/150994.html</trackback:ping><description><![CDATA[<p><a href="http://acm.timus.ru/problem.aspx?space=1&amp;num=1280">http://acm.timus.ru/problem.aspx?space=1&amp;num=1280</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开始做这题，感觉巨简单，然后直接Topological Sorting，然后随便整，结果各种WR，后来细想一下，应该在建图后，每读入一个点，就判断当前点是否入度为零，不是的话，直接NO，否则删掉当前点的出边，继续读点处理，直到处理完N个点，就OK啦！<br /><br />Code：<br />#include<cstdio>&lt;cstdio&gt;<br /><br />struct Edg{<br />&nbsp;&nbsp;&nbsp;int n;<br />&nbsp;&nbsp;&nbsp;int next;<br />}EE[100001];<br /><br />int head[1011];<br />int rd[1011];<br />int top;<br />int n;<br />int m;<br /><br />int Topological_Sorting(int u){<br />&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;int reVal = 0;<br />&nbsp;&nbsp;&nbsp;if(!rd[u]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int q = head[u];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(q != -1){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd[EE[q].n]--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = EE[q].next;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reVal = 1;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return reVal;<br />}<br /><br />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 I = 0;<br />&nbsp;&nbsp;&nbsp;int J = 0;<br />&nbsp;&nbsp;&nbsp;int isCorrect = 0;<br />&nbsp;&nbsp;&nbsp;while(scanf("%d%d", &amp;n, &amp;m) != 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;head[i] = -1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd[i] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(m-- &gt; 0){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d %d", &amp;I, &amp;J);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rd[J]++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EE[top].n = J;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EE[top].next = head[I];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head[I] = top++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isCorrect = 1;<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("%d", &amp;I);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isCorrect){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isCorrect = Topological_Sorting(I);<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("%s\n", isCorrect == 1 ? "YES" : "NO");<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return 0;<br />}<br /></p>   <img src ="http://www.cppblog.com/lshain/aggbug/150994.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-14 17:16 <a href="http://www.cppblog.com/lshain/articles/150994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Timus 1651. Shortest Subchain(翻译+题解)</title><link>http://www.cppblog.com/lshain/articles/150965.html</link><dc:creator>Lshain</dc:creator><author>Lshain</author><pubDate>Thu, 14 Jul 2011 03:57:00 GMT</pubDate><guid>http://www.cppblog.com/lshain/articles/150965.html</guid><wfw:comment>http://www.cppblog.com/lshain/comments/150965.html</wfw:comment><comments>http://www.cppblog.com/lshain/articles/150965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lshain/comments/commentRss/150965.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lshain/services/trackbacks/150965.html</trackback:ping><description><![CDATA[<a href="http://acm.timus.ru/problem.aspx?space=1&amp;num=1651">http://acm.timus.ru/problem.aspx?space=1&amp;num=1651</a><br />题目大意：&nbsp;<br />&nbsp;&nbsp;&nbsp;有向图由含有n个结点的链表给出，每个链表结点由一个数字表示，相邻两链表结点表示有向图中一条有向边(i-1指向i)，,现要求该链的一条子链，满足以下三个条件：&nbsp;<br />&nbsp;&nbsp;&nbsp;1.子链的起点跟终点分别跟原链相等。&nbsp;<br />&nbsp;&nbsp;&nbsp;2.子链中边的顺序与原链相等；即，原链中边p比边q晚出现的话，子链中边p不能比边q早出现。&nbsp;<br />&nbsp;&nbsp;&nbsp;3.求满足上述条件的最短子链。 <br />原链长度不超过100000， 结点数字在[1~10000]范围内。&nbsp;<br /><a href="http://acm.timus.ru/image/get.aspx/aa40983c-80ff-4743-94ed-0b92f5bf3b3d" target="_blank"><img style="width: 170px" class="resizeable" title="单击此在新窗口浏览图片" border="0" alt="" src="http://acm.timus.ru/image/get.aspx/aa40983c-80ff-4743-94ed-0b92f5bf3b3d" jquery1310613908781="1" /></a> <br />Sample Input <br />9 <br />1 2 7 3 2 8 4 8 5 <br />Sample Output <br />1 2 8 5<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我的想法是直接从左向右扫一遍，O(n)复杂度。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;主要思路：依次从左向右扫描，分情况处理，并在处理时记录终点的最小值，以及位置。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. 假设当前位置i上的结点没有被扩展过，那么当前<span style="color: red">位置</span>的距离值（到起始结点）cost[i] = cost[i - 1] + t;&nbsp;（t任意正值）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同时记录当前<span style="color: red">结点</span>的cost值，以及当前<span style="color: red">位置</span>的前驱<span style="color: red">位置</span>。并将当前结点标记为已扩展。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. 假设当前位置i上的结点已被扩展过，且当前<span style="color: red">结点</span>的cost大于前一<span style="color: red">位置</span>的cost值 + t，那么当前<span style="color: red">位置</span>的距离值（到起始结点）cost[i] = cost[i - 1] + t;&nbsp;（t任意正值），&nbsp;同时更新当前<span style="color: red">结点</span>的cost值，以及当前<span style="color: red">位置</span>的前驱<span style="color: red">位置</span>。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3. 假设当前位置i上的结点已被扩展过，且当前<span style="color: red">结点</span>的cost小于等于前一<span style="color: red">位置</span>的cost值 + t，那么当前<span style="color: red">位置</span>的距离值（到起始结点）cost[i] = 当前<span style="color: red">结点</span>的cost，&nbsp;同时记录当前<span style="color: red">位置</span>的前驱<span style="color: red">位置</span>。（注意：此时前驱位置为当前结点最后一次更新时的位置的前驱）；<br /><br />eg:<br />位置:&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;9<br />位置上的结点值:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;5 <br />cost:&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;4<br />前驱位置:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp; 8<br /><br />Code:<br /><br />#include&lt;cstdio&gt;<br />#include&lt;cstdlib&gt;
<p>int Q[100001];<br />int pre[100001];<br />int cost[100001];<br />int lastPos[10001];<br />int check[10001];<br />int ans[10001];<br />int minD;<br />int I;<br />int nq;<br />int na;</p>
<p>inline int nextInt(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char ch = getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(ch &lt; '0' || ch &gt; '9'){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(ch &gt;= '0' &amp;&amp; ch &lt;= '9'){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = x * 10 + ch - 48;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ch = getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return x;<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 end = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(scanf("%d", &amp;nq) != EOF){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 0; i &lt; 100001; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pre[i] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i &lt; 10001){<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;check[i] = 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;lastPos[i] = 0;<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;&nbsp;for(i = 1; i &lt;= nq; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Q[i] = nextInt();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end = Q[nq];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cost[0] = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minD = 100011;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = 1; i &lt;= nq; i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!check[Q[i]] || cost[i - 1] + 1 &lt; check[Q[i]]){<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;cost[i] = cost[i - 1] + 1;<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;check[Q[i]] = cost[i];<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;pre[i] = i - 1;<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;else{<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;cost[i] = check[Q[i]];<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;pre[i] = pre[lastPos[Q[i]]];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastPos[Q[i]] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Q[i] == end &amp;&amp; cost[i] &lt; minD){<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;minD = cost[i];<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;I = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;na = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans[na++] = end;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I = pre[I];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(I){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans[na++] = Q[I];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I = pre[I];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i = na - 1; i &gt;= 0; i--){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i != na - 1){<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;printf(" ");<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;printf("%d", ans[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />}</p><br /> <img src ="http://www.cppblog.com/lshain/aggbug/150965.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-14 11:57 <a href="http://www.cppblog.com/lshain/articles/150965.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>