﻿<?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++博客-JulyRina's blog-随笔分类-解题报告</title><link>http://www.cppblog.com/JulyRina/category/21057.html</link><description>welcome to July Rina's blog</description><language>zh-cn</language><lastBuildDate>Wed, 01 Apr 2015 22:11:10 GMT</lastBuildDate><pubDate>Wed, 01 Apr 2015 22:11:10 GMT</pubDate><ttl>60</ttl><item><title>POJ 1050 To the Max 最大子矩阵 动态规划</title><link>http://www.cppblog.com/JulyRina/archive/2015/03/31/210214.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Tue, 31 Mar 2015 15:15:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/03/31/210214.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/210214.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/03/31/210214.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/210214.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/210214.html</trackback:ping><description><![CDATA[题意：求一个n*n矩阵的最大子矩阵。<br />解题思路：类似一维情况下的最大连续子串。<br />代码：<span style="font-size: 13px; background-color: #eeeeee;">#include&nbsp;</span><span style="font-size: 13px; background-color: #eeeeee;">&lt;</span><span style="font-size: 13px; background-color: #eeeeee;">cstdio</span><span style="font-size: 13px; background-color: #eeeeee;">&gt;</span><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">#include&nbsp;&lt;cstring&gt;<br />#include&nbsp;&lt;iostream&gt;<br />#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxn&nbsp;=&nbsp;110;<br /><span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;a[maxn][maxn],&nbsp;r[maxn][maxn]&nbsp;,&nbsp;f[maxn];<br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d",&nbsp;&amp;n))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=1;i&lt;=n;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=1;j&lt;=n;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;a[i][j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=1;i&lt;=n;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=1;j&lt;=n;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r[i][j]&nbsp;=&nbsp;r[i-1][j]&nbsp;+&nbsp;a[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ans&nbsp;=&nbsp;a[0][0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=1;i&lt;=n;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=i;j&lt;=n;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;k=1;k&lt;=n;k++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(f[k-1]&nbsp;&lt;&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[k]&nbsp;=&nbsp;r[j][k]&nbsp;-&nbsp;r[i-1][k];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f[k]&nbsp;=&nbsp;f[k-1]&nbsp;+&nbsp;r[j][k]&nbsp;-&nbsp;r[i-1][k];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(f[k]&nbsp;&gt;&nbsp;ans)&nbsp;ans&nbsp;=&nbsp;f[k];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;ans);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div><img src ="http://www.cppblog.com/JulyRina/aggbug/210214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-03-31 23:15 <a href="http://www.cppblog.com/JulyRina/archive/2015/03/31/210214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 2387 Til the Cows Come Home 单源最短路（SPFA算法）</title><link>http://www.cppblog.com/JulyRina/archive/2015/02/13/209820.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Fri, 13 Feb 2015 11:42:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/02/13/209820.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209820.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/02/13/209820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209820.html</trackback:ping><description><![CDATA[<div>题目大意：求图上单点到单点之间的最短路。</div><div>题目分析：SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现，减少了不必要的冗余计算。</div><div>算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素，并对所有与他相邻的点进行松弛，若某个相邻的点松弛成功，则将其入队。 直到队列为空时算法结束。</div><div>这个算法，简单的说就是队列优化的bellman-ford,利用了每个点不会更新次数太多的特点发明的此算法</div><div>SPFA&#8212;&#8212;Shortest Path Faster Algorithm，它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径，可以处理负边。SPFA的实现甚至比Dijkstra或者Bellman_Ford还要简单：</div><div>设Dist代表S到I点的当前最短距离，Fa代表S到I的当前最短路径中I点之前的一个点的编号。开始时Dist全部为+&#8734;，只有Dist[S]=0，Fa全部为0。</div><div>维护一个队列，里面存放所有需要进行迭代的点。初始时队列中只有一个点S。用一个布尔数组记录每个点是否处在队列中。</div><div>每次迭代，取出队头的点v，依次枚举从v出发的边v-&gt;u，设边的长度为len，判断Dist[v]+len是否小于Dist[u]，若小于则改进Dist[u]，将Fa[u]记为v，并且由于S到u的最短距离变小了，有可能u可以改进其它的点，所以若u不在队列中，就将它放入队尾。这样一直迭代下去直到队列变空，也就是S到所有的最短距离都确定下来，结束算法。若一个点入队次数超过n，则有负权环。</div><div>SPFA 在形式上和宽度优先搜索非常类似，不同的是宽度优先搜索中一个点出了队列就不可能重新进入队列，但是SPFA中一个点可能在出队列之后再次被放入队列，也就是一个点改进过其它的点之后，过了一段时间可能本身被改进，于是再次用来改进其它的点，这样反复迭代下去。设一个点用来作为迭代点对其它点进行改进的平均次数为k，有办法证明对于通常的情况，k在2左右。</div><div>SPFA算法（Shortest Path Faster Algorithm），也是求解单源最短路径问题的一种算法，用来解决：给定一个加权有向图G和源点s，对于图G中的任意一点v，求从s到v的最短路径。 SPFA算法是Bellman-Ford算法的一种队列实现，减少了不必要的冗余计算，他的基本算法和Bellman-Ford一样，并且用如下的方法改进： 1、第二步，不是枚举所有节点，而是通过队列来进行优化 设立一个先进先出的队列用来保存待优化的结点，优化时每次取出队首结点u，并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作，如果v点的最短路径估计值有所调整，且v点不在当前的队列中，就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作，直至队列空为止。 2、同时除了通过判断队列是否为空来结束循环，还可以通过下面的方法： 判断有无负环：如果某个点进入队列的次数超过V次则存在负环（SPFA无法处理带负环的图）。</div><div>SPFA算法有两个优化算法 SLF 和 LLL： SLF：Small Label First 策略，设要加入的节点是j，队首元素为i，若dist(j)&lt;dist(i)，则将j插入队首，否则插入队尾。 LLL：Large Label Last 策略，设队首元素为i，队列中所有dist值的平均值为x，若dist(i)&gt;x则将i插入到队尾，查找下一元素，直到找到某一i使得dist(i)&lt;=x，则将i出对进行松弛操作。 SLF 可使速度提高 15 ~ 20%；SLF + LLL 可提高约 50%。 在实际的应用中SPFA的算法时间效率不是很稳定，为了避免最坏情况的出现，通常使用效率更加稳定的Dijkstra算法。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;cstdio&gt;<br />#include&nbsp;&lt;iostream&gt;<br />#include&nbsp;&lt;vector&gt;<br />#include&nbsp;&lt;queue&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><span style="color: #0000FF; ">#define</span>&nbsp;INF&nbsp;(1&lt;&lt;29)<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxn&nbsp;=&nbsp;1010;<br /><br />typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;P;<br />vector&lt;P&gt;&nbsp;G[maxn];<br />queue&lt;<span style="color: #0000FF; ">int</span>&gt;&nbsp;que;<br /><span style="color: #0000FF; ">int</span>&nbsp;V,&nbsp;E,&nbsp;dist[maxn];<br /><span style="color: #0000FF; ">bool</span>&nbsp;vis[maxn];<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;spfa(<span style="color: #0000FF; ">int</span>&nbsp;s)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;fill(dist,&nbsp;dist+V,&nbsp;INF);<br />&nbsp;&nbsp;&nbsp;&nbsp;fill(vis,&nbsp;vis+V,&nbsp;<span style="color: #0000FF; ">false</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;dist[s]&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(!que.empty())&nbsp;que.pop();<br />&nbsp;&nbsp;&nbsp;&nbsp;que.push(s);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(!que.empty())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u&nbsp;=&nbsp;que.front();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.pop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis[u]&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sz&nbsp;=&nbsp;G[u].size();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;sz;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;G[u][i].first;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;w&nbsp;=&nbsp;G[u][i].second;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dist[v]&nbsp;&gt;&nbsp;dist[u]&nbsp;+&nbsp;w)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[v]&nbsp;=&nbsp;dist[u]&nbsp;+&nbsp;w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!vis[v])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis[v]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.push(v);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d"&nbsp;,&nbsp;&amp;E,&nbsp;&amp;V);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;V;i++)&nbsp;G[i].clear();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;E;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d"&nbsp;,&nbsp;&amp;u,&nbsp;&amp;v,&nbsp;&amp;w);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;--;&nbsp;v&nbsp;--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[u].push_back(make_pair(v,&nbsp;w));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[v].push_back(make_pair(u,&nbsp;w));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;spfa(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;dist[V-1]);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div></div><img src ="http://www.cppblog.com/JulyRina/aggbug/209820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-02-13 19:42 <a href="http://www.cppblog.com/JulyRina/archive/2015/02/13/209820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 2387 Til the Cows Come Home 单源最短路（Dijkstra算法 堆优化）</title><link>http://www.cppblog.com/JulyRina/archive/2015/02/13/209819.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Fri, 13 Feb 2015 11:38:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/02/13/209819.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209819.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/02/13/209819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209819.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209819.html</trackback:ping><description><![CDATA[<div>题目大意：求图上单点到单点之间的最短路。</div>
<div></div>
<div>题目分析：之前我们在同一道问题上分析过了单源最短路问题的<a href="http://www.cppblog.com/JulyRina/archive/2015/02/13/209818.html">Dijkstra算法</a>。<br />
<div>使用邻接矩阵实现的Dijkstra算法的时间复杂度是O(|V|^2)。使用邻接表的话，更新最短距离只需要更新每一条边即可，因此这部分的时间复杂度是O(|E|)。但是每次要枚举所有的顶点来查找下一个使用的顶点，因此最终复杂度还是O(|V|^2)。在|E|比较小时，大部分经历放在了查找下一次要是用的顶点上，因此需要使用合适的数据结构对其进行优化。</div>
<div>需要优化的是数值的插入（更新）和取出最小值两个操作，因此使用堆就可以了。把每个顶点当前的最短距离用堆维护，在更新最短距离时，把对应的元素往根的方向移动以满足堆的性质。而每次从堆中取出的最小值就是下一次要使用的顶点。这样堆中元素共有O(|V|)个，更新和取出数值的操作有O(|E|)次，因此整个算法的复杂度是O(|E|log(V))</div>
<div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#include&nbsp;&lt;cstdio&gt;<br />
#include&nbsp;&lt;iostream&gt;<br />
#include&nbsp;&lt;queue&gt;<br />
#include&nbsp;&lt;vector&gt;<br />
<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br />
<span style="color: #0000FF; ">#define</span>&nbsp;INF&nbsp;(1&lt;&lt;29)<br />
<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxn&nbsp;=&nbsp;1010;<br />
<br />
typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;P;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">first是最短距离，second是顶点的编号</span><span style="color: #008000; "><br />
</span><span style="color: #0000FF; ">int</span>&nbsp;V,&nbsp;dist[maxn];<br />
vector&lt;P&gt;&nbsp;G[maxn];<br />
<br />
<span style="color: #0000FF; ">void</span>&nbsp;dijkstra(<span style="color: #0000FF; ">int</span>&nbsp;s)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">通过指定greater&lt;P&gt;参数，堆按照first从小到大的顺序取出值</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;priority_queue&lt;P,&nbsp;vector&lt;P&gt;,&nbsp;greater&lt;P&gt;&nbsp;&gt;&nbsp;que;<br />
&nbsp;&nbsp;&nbsp;&nbsp;fill(dist,&nbsp;dist&nbsp;+&nbsp;V&nbsp;,&nbsp;INF);<br />
&nbsp;&nbsp;&nbsp;&nbsp;dist[s]&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(!que.empty())&nbsp;que.pop();<br />
&nbsp;&nbsp;&nbsp;&nbsp;que.push(P(0,&nbsp;s));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(!que.empty())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P&nbsp;p&nbsp;=&nbsp;que.top();&nbsp;que.pop();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u&nbsp;=&nbsp;p.second;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dist[u]&nbsp;&lt;&nbsp;p.first)&nbsp;<span style="color: #0000FF; ">continue</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sz&nbsp;=&nbsp;G[u].size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;sz;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;to&nbsp;=&nbsp;G[u][i].second;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;cost&nbsp;=&nbsp;G[u][i].first;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dist[to]&nbsp;&gt;&nbsp;dist[u]&nbsp;+&nbsp;cost)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[to]&nbsp;=&nbsp;dist[u]&nbsp;+&nbsp;cost;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.push(P(dist[to],&nbsp;to));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;m;<br />
&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d"&nbsp;,&nbsp;&amp;m,&nbsp;&amp;V);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;V;i++)&nbsp;G[i].clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;m;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;from,&nbsp;to,&nbsp;cost;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d"&nbsp;,&nbsp;&amp;from,&nbsp;&amp;to,&nbsp;&amp;cost);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;--;&nbsp;to&nbsp;--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[from].push_back(P(cost,&nbsp;to));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[to].push_back(P(cost,&nbsp;from));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;dijkstra(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;dist[V-1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}</div>
</div>
</div>
<img src ="http://www.cppblog.com/JulyRina/aggbug/209819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-02-13 19:38 <a href="http://www.cppblog.com/JulyRina/archive/2015/02/13/209819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 2387 Til the Cows Come Home 单源最短路（Dijkstra算法）</title><link>http://www.cppblog.com/JulyRina/archive/2015/02/13/209818.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Fri, 13 Feb 2015 11:34:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/02/13/209818.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209818.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/02/13/209818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209818.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209818.html</trackback:ping><description><![CDATA[<span style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20.7999992370605px; background-color: #ffffff;">题目大意：求图上单点到单点之间的最短路。</span><br style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20.7999992370605px;" />
<br style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20.7999992370605px;" />
<span style="background-color: #ffffff;"><font color="#4b4b4b" face="georgia, verdana, Arial, helvetica, sans-seriff"><span style="font-size: 13px; line-height: 20.7999992370605px;">题目分析：</span></font></span><span style="font-size: 13px; line-height: 20.7999992370605px;">让我们考虑没有负边的情况。在Bellman-Ford算法中，如果dist[i]还不是最短距离的话，那么即使进行dist[j]=dist[i]+(从i到j的边的权值)的更新，dist[j]也不会变成最短距离。而且，即使dist[i]没有变化，每一次循环也要检查一遍从i出发的所有变。这显然是很浪费时间的。因此可以对算法作如下修改。</span>
<div><span style="font-size: 13px; line-height: 20.7999992370605px;">（1）找到最短距离已经确定的顶点，从他出发更新相邻顶点的最短距离。</span></div>
<div><span style="font-size: 13px; line-height: 20.7999992370605px;">（2）此后不再需要关心（1）中的&#8220;最短距离已经确定的顶点&#8221;。</span></div>
<div><span style="font-size: 13px; line-height: 20.7999992370605px;">在（1）和（2）中提到的&#8220;最短距离已经确定的&#8221;要怎么得到时问题的关键。在最开始时，只有起点的最短距离是确定的。而在尚未使用过的顶点中，距离dist[i]最小的顶点就会加入&#8220;最短距离已经确定的顶点&#8221;的阵营。这是因为由于不会存在负边，所以dist[i]不会在之后的更新中变小。这个算法叫做Dijkstra算法。<br />
</span>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#include&nbsp;&lt;cstdio&gt;<br />
#include&nbsp;&lt;iostream&gt;<br />
#include&nbsp;&lt;vector&gt;<br />
<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br />
<span style="color: #0000FF; ">#define</span>&nbsp;INF&nbsp;(1&lt;&lt;29)<br />
<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxn&nbsp;=&nbsp;1010;<br />
<br />
typedef&nbsp;pair&lt;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&gt;&nbsp;P;<br />
vector&lt;P&gt;&nbsp;G[maxn];<br />
<span style="color: #0000FF; ">int</span>&nbsp;V,&nbsp;E,&nbsp;dist[maxn];<br />
<span style="color: #0000FF; ">bool</span>&nbsp;vis[maxn];<br />
<br />
<span style="color: #0000FF; ">void</span>&nbsp;dijkstra(<span style="color: #0000FF; ">int</span>&nbsp;s)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;fill(dist,&nbsp;dist&nbsp;+&nbsp;V,&nbsp;INF);<br />
&nbsp;&nbsp;&nbsp;&nbsp;fill(vis,&nbsp;vis&nbsp;+&nbsp;V,&nbsp;<span style="color: #0000FF; ">false</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;dist[s]&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(<span style="color: #0000FF; ">true</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u&nbsp;=&nbsp;-1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;V;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!vis[i]&nbsp;&amp;&amp;&nbsp;(u&nbsp;==&nbsp;-1&nbsp;||&nbsp;dist[i]&nbsp;&lt;&nbsp;dist[u]))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;=&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(u&nbsp;==&nbsp;-1)&nbsp;<span style="color: #0000FF; ">break</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis[u]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;sz&nbsp;=&nbsp;G[u].size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;sz;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;v&nbsp;=&nbsp;G[u][i].first;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;w&nbsp;=&nbsp;G[u][i].second;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[v]&nbsp;=&nbsp;min(dist[v],&nbsp;dist[u]&nbsp;+&nbsp;w);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d"&nbsp;,&nbsp;&amp;E,&nbsp;&amp;V);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;V;i++)&nbsp;G[i].clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;E;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;u,&nbsp;v,&nbsp;w;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d"&nbsp;,&nbsp;&amp;u,&nbsp;&amp;v,&nbsp;&amp;w);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u&nbsp;--;&nbsp;v&nbsp;--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[u].push_back(make_pair(v,&nbsp;w));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G[v].push_back(make_pair(u,&nbsp;w));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;dijkstra(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;dist[V-1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}</div>
</div>
<div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20.7999992370605px;"></div><img src ="http://www.cppblog.com/JulyRina/aggbug/209818.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-02-13 19:34 <a href="http://www.cppblog.com/JulyRina/archive/2015/02/13/209818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 2387 Til the Cows Come Home 单源最短路（Bellman-ford算法）</title><link>http://www.cppblog.com/JulyRina/archive/2015/02/13/209817.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Fri, 13 Feb 2015 11:32:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/02/13/209817.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209817.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/02/13/209817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209817.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209817.html</trackback:ping><description><![CDATA[题目大意：求图上单点到单点之间的最短路。<br />
<br />
题目分析：单源最短路问题是固定一个起点，求它到其他所有点的最短路的问题。终点也固定问题叫做两点之间最短路问题。但是因为单源最短路问题的复杂度是一样的，因此通常当作单源最短路问题来求解。
<div>记从起点s出发到顶点i的最短距离为dist[i]。则下述等式成立。</div>
<div><span style="white-space:pre">	</span>dist[i] = min{dist[j]+(从j到i的边的权值)|e=(j,i)&#8712;E}</div>
<div>如果给定的图是一个DAG，就可以按托不许给顶点编号，并利用这条递推关系计算出dist。但是，如果图中有圈，就无法利用这样的关系进行计算。</div>
<div>在这种情况下，记当前到顶点i的最短距离为dist[i]，并设初值dist[s]=0，dist[i]=INF（足够大的常数），再不断使用这条地推关系式更新dist值，就可以算出新的dist。</div>
<div>只要途中不存在负圈，这样的更新操作就是有限的。结束之后的最短操作就是所求的最短距离了。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#include&nbsp;&lt;cstdio&gt;<br />
#include&nbsp;&lt;cstring&gt;<br />
#include&nbsp;&lt;iostream&gt;<br />
#include&nbsp;&lt;vector&gt;<br />
<span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br />
<span style="color: #0000FF; ">#define</span>&nbsp;INF&nbsp;(1&lt;&lt;29)<br />
<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxn&nbsp;=&nbsp;1010,&nbsp;maxm&nbsp;=&nbsp;4040;<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m;<br />
<br />
<span style="color: #0000FF; ">struct</span>&nbsp;Edge&nbsp;{&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;from,&nbsp;to,&nbsp;cost;&nbsp;}&nbsp;edge[maxm];<br />
<span style="color: #0000FF; ">int</span>&nbsp;V,&nbsp;E,&nbsp;dist[maxn];<br />
<br />
<span style="color: #0000FF; ">void</span>&nbsp;bellman_ford(<span style="color: #0000FF; ">int</span>&nbsp;s)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;V;i++)&nbsp;dist[i]&nbsp;=&nbsp;INF;<br />
&nbsp;&nbsp;&nbsp;&nbsp;dist[s]&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(<span style="color: #0000FF; ">true</span>)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;update&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;E;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge&nbsp;e&nbsp;=&nbsp;edge[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dist[e.from]&nbsp;!=&nbsp;INF&nbsp;&amp;&amp;&nbsp;dist[e.to]&nbsp;&gt;&nbsp;dist[e.from]&nbsp;+&nbsp;e.cost)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[e.to]&nbsp;=&nbsp;dist[e.from]&nbsp;+&nbsp;e.cost;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!update)&nbsp;<span style="color: #0000FF; ">break</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d"&nbsp;,&nbsp;&amp;m,&nbsp;&amp;n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;V&nbsp;=&nbsp;n;&nbsp;E&nbsp;=&nbsp;2&nbsp;*&nbsp;m;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;E;i+=2)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Edge&nbsp;e;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;from,&nbsp;to,&nbsp;cost;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d"&nbsp;,&nbsp;&amp;from,&nbsp;&amp;to,&nbsp;&amp;cost);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;--;&nbsp;to&nbsp;--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edge[i].from&nbsp;=&nbsp;from;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edge[i].to&nbsp;=&nbsp;to;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edge[i].cost&nbsp;=&nbsp;cost;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edge[i+1].from&nbsp;=&nbsp;to;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edge[i+1].to&nbsp;=&nbsp;from;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edge[i+1].cost&nbsp;=&nbsp;cost;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;bellman_ford(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d",&nbsp;dist[n-1]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}</div>
<div>这个算法叫做Bellman-Ford算法。如果在图中不存在从s可达的负圈，那么最短路不会经过同一个顶点两次（也就是说，最多通过|V|-1次），while(true)的循环最多经过|V|-1次，因此，复杂度是O(VE)。反之，如果存在从s可达的负圈，那么在第|V|次循环中也会更新dist的值，因此也可以用这个性质来检查负圈。如果一开始对所有的i，都把dist[i]设为0，那么可以检查出所有的负圈。</div>
<div>
<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">bool</span>&nbsp;find_negetive_loop()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;memset(dist,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(dist));<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;V;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=0;j&lt;E;j++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dist[e.to]&nbsp;&gt;&nbsp;dist[e.from]&nbsp;+&nbsp;e.cost)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist[e.to]&nbsp;=&nbsp;dist[e.from]&nbsp;+&nbsp;e.cost;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(i&nbsp;==&nbsp;V-1)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />
}</div>
</div>
</div><img src ="http://www.cppblog.com/JulyRina/aggbug/209817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-02-13 19:32 <a href="http://www.cppblog.com/JulyRina/archive/2015/02/13/209817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HDU 3605 Escape 二分图的多重匹配(匈牙利算法)</title><link>http://www.cppblog.com/JulyRina/archive/2015/02/13/209816.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Fri, 13 Feb 2015 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/02/13/209816.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209816.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/02/13/209816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209816.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209816.html</trackback:ping><description><![CDATA[<div>题目大意：有N(N&lt;100,000)个人要去M(M&lt;10)个星球，每个人只可以去一些星球，一个星球最多容纳Ki个人。请问是否所有人都可以选择自己的星球</div><div><span style="white-space:pre">	</span></div><div>题目分析；直接建立二分图模型，使用匈牙利算法。</div><div>&nbsp; &nbsp; 匈牙利算法可以解决多重匹配，原理和二分图最大匹配很像。注意不要把可以匹配多个的点分割然后按照正常的二分匹配来做，那样肯定会挂的。</div><div>&nbsp; &nbsp; 解决多重匹配就是记录一下多重匹配的点(简称Y方点)已经匹配了Pi个点。如果Pi&lt;Ki那么就直接上了，否则的话继续搜索Yi已经匹配的每一个点并将Yi染色。</div><div>&nbsp; &nbsp; 因为Yi搜一次就需要染色了，而且Y方点最多是10个，所以每次找增广路的深度最多是10，这样就很快了。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;cstdio&gt;<br />#include&nbsp;&lt;cstring&gt;<br />#include&nbsp;&lt;vector&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxn&nbsp;=&nbsp;100010;<br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxm&nbsp;=&nbsp;11;<br /><span style="color: #0000FF; ">int</span>&nbsp;y_match[maxn][maxm],&nbsp;g[maxn][maxm],&nbsp;cnt[maxm],&nbsp;capacity[maxn],&nbsp;n,&nbsp;m;<br /><span style="color: #0000FF; ">bool</span>&nbsp;vis[maxm];<br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;x)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;m;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(g[x][i]&nbsp;==&nbsp;0&nbsp;||&nbsp;vis[i]&nbsp;==&nbsp;<span style="color: #0000FF; ">true</span>)&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis[i]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(cnt[i]&nbsp;&lt;&nbsp;capacity[i])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y_match[x][cnt[i]++]&nbsp;=&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=0;j&lt;capacity[i];j++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dfs(y_match[i][j])&nbsp;==&nbsp;<span style="color: #0000FF; ">true</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y_match[i][j]&nbsp;=&nbsp;x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />}<br /><span style="color: #0000FF; ">bool</span>&nbsp;hungary(<span style="color: #0000FF; ">int</span>&nbsp;n)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;n;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(vis,&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">bool</span>)*(m));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(dfs(i)&nbsp;==&nbsp;<span style="color: #0000FF; ">false</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />}<br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d"&nbsp;,&nbsp;&amp;n,&nbsp;&amp;m))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(cnt,&nbsp;0,&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">int</span>)*(n));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;n;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=0;j&lt;m;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;g[i][j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;m;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;capacity[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(hungary(n)&nbsp;==&nbsp;<span style="color: #0000FF; ">true</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts("YES");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts("NO");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div></div><img src ="http://www.cppblog.com/JulyRina/aggbug/209816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-02-13 16:23 <a href="http://www.cppblog.com/JulyRina/archive/2015/02/13/209816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 1182 食物链 并查集</title><link>http://www.cppblog.com/JulyRina/archive/2015/02/11/209797.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Wed, 11 Feb 2015 09:33:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/02/11/209797.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209797.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/02/11/209797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209797.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209797.html</trackback:ping><description><![CDATA[<div>题目大意：动物王国中有三类动物A,B,C，这三类动物的食物链构成了有趣的环形。A吃B， B吃C，C吃A。&nbsp;</div><div>现有N个动物，以1－N编号。每个动物都是A,B,C中的一种，但是我们并不知道它到底是哪一种。&nbsp;</div><div>有人用两种说法对这N个动物所构成的食物链关系进行描述：&nbsp;</div><div>第一种说法是"1 X Y"，表示X和Y是同类。&nbsp;</div><div>第二种说法是"2 X Y"，表示X吃Y。&nbsp;</div><div>此人对N个动物，用上述两种说法，一句接一句地说出K句话，这K句话有的是真的，有的是假的。当一句话满足下列三条之一时，这句话就是假话，否则就是真话。&nbsp;</div><div>1）<span style="white-space:pre">	</span>当前的话与前面的某些真的话冲突，就是假话；&nbsp;</div><div>2）<span style="white-space:pre">	</span>当前的话中X或Y比N大，就是假话；&nbsp;</div><div>3）<span style="white-space:pre">	</span>当前的话表示X吃X，就是假话。&nbsp;</div><div>你的任务是根据给定的N（1 &lt;= N &lt;= 50,000）和K句话（0 &lt;= K &lt;= 100,000），输出假话的总数。&nbsp;</div><div><span style="white-space:pre">	</span></div><div>题目分析；由于N和K很大，所以必须高效的维护动物之间的关系，并快速判断是否残生了矛盾，所以决定采用并查集。</div><div>对于每只动物i创建3个元素i,i+N,i+2N,并用这3*N个元素创建并查集。这个并查集维护如下信息：</div><div><span style="white-space:pre">	</span>i+xN表示&#8220;i属于种类x&#8221;。</div><div><span style="white-space:pre">	</span>并查集里的每一个组表示组内所有元素代表的都同时发生或不发生。</div><div>同时，在合并之前先判断合并是否会产生矛盾。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;cstdio&gt;<br />#include&nbsp;&lt;iostream&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxn&nbsp;=&nbsp;50050;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;father[maxn*3],&nbsp;n,&nbsp;m,&nbsp;ans;<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;init()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;3*n;i++)&nbsp;father[i]&nbsp;=&nbsp;i;<br />}<br /><span style="color: #0000FF; ">int</span>&nbsp;find(<span style="color: #0000FF; ">int</span>&nbsp;x)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;x&nbsp;==&nbsp;father[x]&nbsp;?&nbsp;x&nbsp;:&nbsp;father[x]&nbsp;=&nbsp;find(father[x]);<br />}<br /><span style="color: #0000FF; ">void</span>&nbsp;unite(<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;a&nbsp;=&nbsp;find(x)&nbsp;,&nbsp;b&nbsp;=&nbsp;find(y);<br />&nbsp;&nbsp;&nbsp;&nbsp;father[a]&nbsp;=&nbsp;father[b]&nbsp;=&nbsp;father[x]&nbsp;=&nbsp;father[y]&nbsp;=&nbsp;min(a,&nbsp;b);<br />}<br /><span style="color: #0000FF; ">bool</span>&nbsp;check(<span style="color: #0000FF; ">int</span>&nbsp;d,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(x&nbsp;&gt;=&nbsp;n&nbsp;||&nbsp;y&nbsp;&gt;=&nbsp;n&nbsp;||&nbsp;x&nbsp;&lt;&nbsp;0&nbsp;||&nbsp;y&nbsp;&lt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(d&nbsp;==&nbsp;2&nbsp;&amp;&amp;&nbsp;x&nbsp;==&nbsp;y)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(d&nbsp;==&nbsp;1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(find(x)&nbsp;==&nbsp;find(y+n)&nbsp;||&nbsp;find(x)&nbsp;==&nbsp;find(y+2*n))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unite(x,&nbsp;y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unite(x+n,&nbsp;y+n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unite(x+2*n,&nbsp;y+2*n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(find(x)&nbsp;==&nbsp;find(y)&nbsp;||&nbsp;find(x)&nbsp;==&nbsp;find(y+2*n))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unite(x,&nbsp;y+n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unite(x+n,&nbsp;y+2*n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unite(x+2*n,&nbsp;y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d"&nbsp;,&nbsp;&amp;n,&nbsp;&amp;m);<br />&nbsp;&nbsp;&nbsp;&nbsp;init();<br />&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;m;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;d,&nbsp;x,&nbsp;y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d%d",&nbsp;&amp;d,&nbsp;&amp;x,&nbsp;&amp;y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;--;&nbsp;y&nbsp;--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(check(d,&nbsp;x,&nbsp;y)&nbsp;==&nbsp;<span style="color: #0000FF; ">false</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;ans);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div></div><img src ="http://www.cppblog.com/JulyRina/aggbug/209797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-02-11 17:33 <a href="http://www.cppblog.com/JulyRina/archive/2015/02/11/209797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 3617 Best Cow Line 简单贪心</title><link>http://www.cppblog.com/JulyRina/archive/2015/02/11/209795.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Wed, 11 Feb 2015 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/02/11/209795.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209795.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/02/11/209795.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209795.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209795.html</trackback:ping><description><![CDATA[<div>题目大意：给定长度为N的字符串S，要构造一个长度为N的字符串T。起初，T是一个空串，随后反复进行下列任意操作。</div><div><span style="white-space:pre">	</span>从S的头部删除一个字符，加到T的尾部</div><div><span style="white-space:pre">	</span>从S的尾部删除一个字符，加到T的尾部</div><div>目标是构造字典序尽可能小的字符串。</div><div><span style="white-space:pre">	</span></div><div>题目分析；从字典序的性质上看，无论T的末尾有多大，只要前面部分较小就可以。所以我们可以试一下如下贪心算法：</div><div><span style="white-space:pre">	</span>不断取S和T的末尾中较小的一个字符放到T的末尾</div><div></div><div>这个算法已经接近正确了，只是针对S的开头和末尾字符相同的情形还没有定义。在这种情况下，因为我们希望能够尽早使用更小的字符，所以就要比较一下下一个字符的大小。下一个字符也有可能相同，因此就有如下算法：</div><div><span style="white-space:pre">	</span>按照字典序比较字符串S和S反转后的字符串S'。</div><div><span style="white-space:pre">	</span>如果S较小，就从S的开头取出一个文字，放到T的末尾。</div><div><span style="white-space:pre">	</span>如果S'较小，就从S的末尾取出一个文字，放到T的末尾。</div><div><span style="white-space:pre">	</span>（若果相同则去哪一个都可以）</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;cstdio&gt;<br /><br /><span style="color: #0000FF; ">char</span>&nbsp;s[2002],&nbsp;tmp[2];<br /><span style="color: #0000FF; ">int</span>&nbsp;n;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d",&nbsp;&amp;n))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;n;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s",&nbsp;tmp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]&nbsp;=&nbsp;tmp[0];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;l&nbsp;=&nbsp;0,&nbsp;r&nbsp;=&nbsp;n&nbsp;-&nbsp;1,&nbsp;cnt&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(l&nbsp;&lt;=&nbsp;r)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0,&nbsp;left&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(l&nbsp;+&nbsp;i&nbsp;&lt;=&nbsp;r&nbsp;-&nbsp;i)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(s[l+i]&nbsp;&lt;&nbsp;s[r-i])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(s[l+i]&nbsp;&gt;&nbsp;s[r-i])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;left&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(left&nbsp;==&nbsp;<span style="color: #0000FF; ">true</span>)&nbsp;putchar(s[l++]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;putchar(s[r--]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(cnt&nbsp;%&nbsp;80&nbsp;==&nbsp;0)&nbsp;putchar('\n');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(cnt&nbsp;%&nbsp;80)&nbsp;putchar('\n');<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div></div><img src ="http://www.cppblog.com/JulyRina/aggbug/209795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-02-11 15:59 <a href="http://www.cppblog.com/JulyRina/archive/2015/02/11/209795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 2386 Lake Counting 简单DFS</title><link>http://www.cppblog.com/JulyRina/archive/2015/02/11/209794.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Wed, 11 Feb 2015 07:29:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/02/11/209794.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209794.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/02/11/209794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209794.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209794.html</trackback:ping><description><![CDATA[<div>题目大意：有一个大小为N*M的园子，雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里总共有多少水洼？</div><div>（八连通指下图中相当于W的*）</div><div>***</div><div>*W*</div><div>***</div><div></div><div>题目分析；从任意的W开始，不同的用一个vis数组标记是否访问过。一次DFS后与初始的这个W相连的W就都被标记过了。因此知道途中不再存在W为止，总共进行DFS的次数就是答案了。</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;cstdio&gt;<br />#include&nbsp;&lt;cstring&gt;<br /><br /><span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;maxn&nbsp;=&nbsp;101;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;m,&nbsp;ans;<br /><span style="color: #0000FF; ">char</span>&nbsp;g[maxn][maxn];<br /><span style="color: #0000FF; ">bool</span>&nbsp;vis[maxn][maxn];<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;dfs(<span style="color: #0000FF; ">int</span>&nbsp;x,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;y)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(vis[x][y]&nbsp;==&nbsp;<span style="color: #0000FF; ">true</span>&nbsp;||&nbsp;g[x][y]&nbsp;!=&nbsp;'W')&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;vis[x][y]&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=-1;i&lt;=1;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=-1;j&lt;=1;j++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(!i&nbsp;&amp;&amp;&nbsp;!j&nbsp;||&nbsp;x&nbsp;+&nbsp;i&nbsp;&lt;&nbsp;0&nbsp;||&nbsp;x&nbsp;+&nbsp;i&nbsp;&gt;=&nbsp;n&nbsp;||&nbsp;y&nbsp;+&nbsp;j&nbsp;&lt;&nbsp;0&nbsp;||&nbsp;y&nbsp;+&nbsp;j&nbsp;&gt;=&nbsp;m)&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(x+i,&nbsp;y+j);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />}<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(~scanf("%d%d"&nbsp;,&nbsp;&amp;n,&nbsp;&amp;m))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;n;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s",&nbsp;g[i]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(vis+i,&nbsp;<span style="color: #0000FF; ">false</span>,&nbsp;<span style="color: #0000FF; ">sizeof</span>(<span style="color: #0000FF; ">bool</span>)*(m));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;n;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;j=0;j&lt;m;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(g[i][j]&nbsp;==&nbsp;'W'&nbsp;&amp;&amp;&nbsp;!vis[i][j])&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ans&nbsp;++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dfs(i,&nbsp;j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",&nbsp;ans);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div></div><img src ="http://www.cppblog.com/JulyRina/aggbug/209794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-02-11 15:29 <a href="http://www.cppblog.com/JulyRina/archive/2015/02/11/209794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 1852 Ants</title><link>http://www.cppblog.com/JulyRina/archive/2015/02/11/209793.html</link><dc:creator>JulyRina</dc:creator><author>JulyRina</author><pubDate>Wed, 11 Feb 2015 07:09:00 GMT</pubDate><guid>http://www.cppblog.com/JulyRina/archive/2015/02/11/209793.html</guid><wfw:comment>http://www.cppblog.com/JulyRina/comments/209793.html</wfw:comment><comments>http://www.cppblog.com/JulyRina/archive/2015/02/11/209793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/JulyRina/comments/commentRss/209793.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/JulyRina/services/trackbacks/209793.html</trackback:ping><description><![CDATA[<div><div>题目大意：很多的蚂蚁都在长度为L（cm）的杆子上爬行，它们的速度都是1cm/s，到了棒子终端的时候，蚂蚁就会掉下去。如果在爬行途中遇到其他蚂蚁，两只蚂蚁的方向都会逆转。已知蚂蚁在棒子的最初位置坐标，但是我们不知道他们会往哪一个方向爬。请求出所有蚂蚁掉下去的最短时间和最长时间。</div><div></div><div>题目分析：虽然当蚂蚁数量很多的时候情况会有很多种，但是先考虑小数量的分析就可以找到解决方法：如果只有两只的话，那么最短时间就是两只蚂蚁距离两端点距离较小的距离中取大者就是所需最短时间，而最长时间就是两只蚂蚁距离两端点距离较大者中取大者就是所需最长时间，例如，长度为10，一只在距离左端2的位置，一只在距离左端6的位置，则最短时间为max(min(2,10-2),min(6,10-6))为4,最长时间为max((max(2,10-2),max(6,10-6)))为8其实就是两只相向而行，当相遇后，都转为逆向，则时间为从相遇点到端点距离大者与相遇前所需时间，分析实际就是2到10的距离，当蚂蚁数量增加时，情况相同。</div><div></div><div>则需要时间最长的的就是让距离端点最近的蚂蚁爬到另一个端点(最远)所需要的时间。</div><div>也就是说，只要找出所有蚂蚁与较远端比较，然后找出最大值就是所需要的最大时间。</div><div></div><div>这里需要注意的就是两只蚂蚁相遇转向的那个梗。事实上，可以知道两只蚂蚁相遇后，当他们保持原样交错而过继续前进也不会有任何问题。这样看来，可以认为每只蚂蚁都是独立运动的，所以要求最长时间，只要求蚂蚁到杆子端点的最大距离就好了。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include&nbsp;&lt;cstdio&gt;<br />#include&nbsp;&lt;iostream&gt;<br /><span style="color: #0000FF; ">using</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;min_time,&nbsp;max_time;<br /><span style="color: #0000FF; ">int</span>&nbsp;h,&nbsp;n,&nbsp;T,&nbsp;tmp;<br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;T);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(T--)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d"&nbsp;,&nbsp;&amp;h,&nbsp;&amp;n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min_time&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_time&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;n;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&nbsp;&amp;tmp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min_time&nbsp;=&nbsp;max(min_time,&nbsp;min(tmp,&nbsp;h&nbsp;-&nbsp;tmp));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_time&nbsp;=&nbsp;max(max_time,&nbsp;max(tmp,&nbsp;h&nbsp;-&nbsp;tmp));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d&nbsp;%d\n",&nbsp;min_time,&nbsp;max_time);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}</div></div></div><img src ="http://www.cppblog.com/JulyRina/aggbug/209793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/JulyRina/" target="_blank">JulyRina</a> 2015-02-11 15:09 <a href="http://www.cppblog.com/JulyRina/archive/2015/02/11/209793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>