﻿<?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++博客-klion-随笔分类-图论</title><link>http://www.cppblog.com/klion/category/13668.html</link><description>klion's blog</description><language>zh-cn</language><lastBuildDate>Tue, 14 Sep 2010 20:32:35 GMT</lastBuildDate><pubDate>Tue, 14 Sep 2010 20:32:35 GMT</pubDate><ttl>60</ttl><item><title>HDU 3631 -- Floyd变体 需要很好的理解Floyd算法</title><link>http://www.cppblog.com/klion/archive/2010/09/14/126599.html</link><dc:creator>Klion</dc:creator><author>Klion</author><pubDate>Tue, 14 Sep 2010 07:53:00 GMT</pubDate><guid>http://www.cppblog.com/klion/archive/2010/09/14/126599.html</guid><wfw:comment>http://www.cppblog.com/klion/comments/126599.html</wfw:comment><comments>http://www.cppblog.com/klion/archive/2010/09/14/126599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/klion/comments/commentRss/126599.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/klion/services/trackbacks/126599.html</trackback:ping><description><![CDATA[<p>转载请注明出处:http://www.klion.0fees.net/?p=39</p>
<p>首先得反省下我的比赛态度,对于这两场比赛,我可以说没有用心做.主要有下面几点:<br>一.看题不细心,或者说根本就没看过题,总是想让队友看题,然后自己想思路,这一点很不好,这一题就可以</p>
<p>看出来,如果当时我仔细看题的话,或许就能出了,就算我不能出,或许和队友的讨论中就能出来,后来导致</p>
<p>队友一直一个人在搞这个题,我一直在酱油 &#8211; -||,这里向两位队友表示对不起.还有就是还没看题就会有</p>
<p>点恐惧感,总怕自己不能做出来,这就是心态的问题了.我想下一场开始我会调好自己的心态的。<br>二.不能静下心来仔细想题,这一点非常不好,感觉这两场比赛自己做的很浮躁,很不好.可以说没有共献.<br>这几天好好反思下自己,在下一场比赛争取做的很好吧。加油！！！<br>下面说说这题的思路<br>对于那个ERROR At point x很好回答,只需要一个bool数组就可以解决了.剩下的就是第二问了,其实这可</p>
<p>以看成是Floyd的变体,对于Floyd算法,一共是3重循环,最外面那一层是中间节点,在这里只不过把那一层</p>
<p>拆开了而已,也就是对于每一个marked的点,把这个点作为中间节点,然后更新所有点对的最短路(这里不用</p>
<p>管这两个点是否被marked,因为如果没有被marked的话,后面判断的时候根本就不会用到这两点的距离)这</p>
<p>样的话,就相当于把Floyd的最外层拆成了一个一个的点,这样时间复杂度是不变的,也就是O(V^3)的.对于</p>
<p>V&lt;=300,完全OK.不过好像对于每个被marked的点进行所有点对的更新时可以在外层循环那加个判断,但是</p>
<p>我没想明白是什么。</p>
</a>
<img src ="http://www.cppblog.com/klion/aggbug/126599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/klion/" target="_blank">Klion</a> 2010-09-14 15:53 <a href="http://www.cppblog.com/klion/archive/2010/09/14/126599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 1273 网络流入门题 ---EK算法</title><link>http://www.cppblog.com/klion/archive/2010/09/14/126597.html</link><dc:creator>Klion</dc:creator><author>Klion</author><pubDate>Tue, 14 Sep 2010 07:52:00 GMT</pubDate><guid>http://www.cppblog.com/klion/archive/2010/09/14/126597.html</guid><wfw:comment>http://www.cppblog.com/klion/comments/126597.html</wfw:comment><comments>http://www.cppblog.com/klion/archive/2010/09/14/126597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/klion/comments/commentRss/126597.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/klion/services/trackbacks/126597.html</trackback:ping><description><![CDATA[<p>转载请注明出处:http://www.klion.0fees.net/?p=33</p>
<p>这题是一个网络流的入门题,由于点和边都不多,所以可以直接用Edmond-Karp算法解决。另外HDU3549也可以用EK算法直接过掉</p>
<p>对于Edmond-Karp算法就是每次用bfs找增广路径,然后改变相应的残留网络就ok了,不过这题要注意的就是两个点之间不一定只有一条边,所以要把所有边都加起来才行。这里贴一下关键代码:</p>
<pre><span style="COLOR: #000000; FONT-FAMILY: Courier New"><span style="COLOR: #0000ff">int</span> bfs<span style="COLOR: #000080">(</span><span style="COLOR: #0000ff">int</span> s,<span style="COLOR: #0000ff">int</span> t,<span style="COLOR: #0000ff">int</span> total<span style="COLOR: #000080">)</span>
<span style="COLOR: #000080">{//这里s是起点 t是终点 total是总的顶点数</span>
<span style="COLOR: #0000ff">int</span> front,rear,u,v<span style="COLOR: #000080">;</span>
<span style="COLOR: #0000ff">int</span> q<span style="COLOR: #000080">[</span><span style="COLOR: #ff0000">206</span><span style="COLOR: #000080">*</span><span style="COLOR: #ff0000">206</span><span style="COLOR: #000080">]</span><span style="COLOR: #000080">;//队列 可以不用开这么大 </span>
memset<span style="COLOR: #000080">(</span>pre,<span style="COLOR: #000080">-</span><span style="COLOR: #ff0000">1</span>,<span style="COLOR: #000080">sizeof</span><span style="COLOR: #000080">(</span>pre<span style="COLOR: #000080">)</span><span style="COLOR: #000080">)</span><span style="COLOR: #000080">;</span>
front <span style="COLOR: #000080">=</span> rear <span style="COLOR: #000080">=</span> <span style="COLOR: #000080">-</span><span style="COLOR: #ff0000">1</span><span style="COLOR: #000080">;</span>
rear<span style="COLOR: #000080">+</span><span style="COLOR: #000080">+</span><span style="COLOR: #000080">;</span>
q<span style="COLOR: #000080">[</span>rear<span style="COLOR: #000080">]</span> <span style="COLOR: #000080">=</span> s<span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">while</span><span style="COLOR: #000080">(</span>front <span style="COLOR: #000080">&lt;</span> rear<span style="COLOR: #000080">)</span>
<span style="COLOR: #000080">{//bfs找增广路径</span>
front<span style="COLOR: #000080">+</span><span style="COLOR: #000080">+</span><span style="COLOR: #000080">;</span>
u <span style="COLOR: #000080">=</span> q<span style="COLOR: #000080">[</span>front<span style="COLOR: #000080">]</span><span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">for</span><span style="COLOR: #000080">(</span>v <span style="COLOR: #000080">=</span> <span style="COLOR: #ff0000">1</span><span style="COLOR: #000080">;</span>v <span style="COLOR: #000080">&lt;</span><span style="COLOR: #000080">=</span> total<span style="COLOR: #000080">;</span>v<span style="COLOR: #000080">+</span><span style="COLOR: #000080">+</span><span style="COLOR: #000080">)</span>
<span style="COLOR: #000080">{</span>
<span style="COLOR: #000080">if</span><span style="COLOR: #000080">(</span><span style="COLOR: #000080">-</span><span style="COLOR: #ff0000">1</span> <span style="COLOR: #000080">=</span><span style="COLOR: #000080">=</span> pre<span style="COLOR: #000080">[</span>v<span style="COLOR: #000080">]</span> <span style="COLOR: #000080">&amp;</span><span style="COLOR: #000080">&amp;</span> num<span style="COLOR: #000080">[</span>u<span style="COLOR: #000080">]</span><span style="COLOR: #000080">[</span>v<span style="COLOR: #000080">]</span> <span style="COLOR: #000080">&gt;</span> <span style="COLOR: #ff0000">0</span><span style="COLOR: #000080">)</span>
<span style="COLOR: #000080">{</span>
pre<span style="COLOR: #000080">[</span>v<span style="COLOR: #000080">]</span> <span style="COLOR: #000080">=</span> u<span style="COLOR: #000080">;</span>
rear<span style="COLOR: #000080">+</span><span style="COLOR: #000080">+</span><span style="COLOR: #000080">;</span>
q<span style="COLOR: #000080">[</span>rear<span style="COLOR: #000080">]</span> <span style="COLOR: #000080">=</span> v<span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">if</span><span style="COLOR: #000080">(</span>v <span style="COLOR: #000080">=</span><span style="COLOR: #000080">=</span> t<span style="COLOR: #000080">)//如果找到了汇点就直接推出</span>
<span style="COLOR: #000080">return</span> <span style="COLOR: #ff0000">1</span><span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">}</span>
<span style="COLOR: #000080">}</span>
<span style="COLOR: #000080">}</span>
<span style="COLOR: #000080">return</span> <span style="COLOR: #ff0000">0</span><span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">}</span>
<span style="COLOR: #000080">void</span> work<span style="COLOR: #000080">(</span><span style="COLOR: #000080">)</span>
<span style="COLOR: #000080">{</span>
<span style="COLOR: #0000ff">int</span> u,v,inc,maxflow<span style="COLOR: #000080">;</span>
maxflow <span style="COLOR: #000080">=</span> <span style="COLOR: #ff0000">0</span><span style="COLOR: #000080">;//初始化流量为0</span>
<span style="COLOR: #000080">while</span><span style="COLOR: #000080">(</span><span style="COLOR: #ff0000">1</span><span style="COLOR: #000080">)</span>
<span style="COLOR: #000080">{</span>
<span style="COLOR: #000080">if</span><span style="COLOR: #000080">(</span><span style="COLOR: #000080">!</span>bfs<span style="COLOR: #000080">(</span><span style="COLOR: #ff0000">1</span>,m,m<span style="COLOR: #000080">)</span><span style="COLOR: #000080">)//如果不存在增广路径 也就是说当前流量为最大流了</span>
<span style="COLOR: #000080">{</span>
<span style="COLOR: #000080">break</span><span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">}</span>
inc <span style="COLOR: #000080">=</span> <span style="COLOR: #ff0000">99999999</span><span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">for</span><span style="COLOR: #000080">(</span>v <span style="COLOR: #000080">=</span> m<span style="COLOR: #000080">;</span>v <span style="COLOR: #000080">!</span><span style="COLOR: #000080">=</span> <span style="COLOR: #ff0000">1</span><span style="COLOR: #000080">;</span>v <span style="COLOR: #000080">=</span> u<span style="COLOR: #000080">)</span>
<span style="COLOR: #000080">{//找这条增广路径能增加的最小流量</span>
u <span style="COLOR: #000080">=</span> pre<span style="COLOR: #000080">[</span>v<span style="COLOR: #000080">]</span><span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">if</span><span style="COLOR: #000080">(</span>num<span style="COLOR: #000080">[</span>u<span style="COLOR: #000080">]</span><span style="COLOR: #000080">[</span>v<span style="COLOR: #000080">]</span> <span style="COLOR: #000080">&lt;</span> inc<span style="COLOR: #000080">)</span>
inc <span style="COLOR: #000080">=</span> num<span style="COLOR: #000080">[</span>u<span style="COLOR: #000080">]</span><span style="COLOR: #000080">[</span>v<span style="COLOR: #000080">]</span><span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">}</span>
<span style="COLOR: #000080">for</span><span style="COLOR: #000080">(</span>v <span style="COLOR: #000080">=</span> m<span style="COLOR: #000080">;</span>v <span style="COLOR: #000080">!</span><span style="COLOR: #000080">=</span> <span style="COLOR: #ff0000">1</span><span style="COLOR: #000080">;</span>v <span style="COLOR: #000080">=</span> u<span style="COLOR: #000080">)</span>
<span style="COLOR: #000080">{//改变残留网络</span>
u <span style="COLOR: #000080">=</span> pre<span style="COLOR: #000080">[</span>v<span style="COLOR: #000080">]</span><span style="COLOR: #000080">;</span>
num<span style="COLOR: #000080">[</span>u<span style="COLOR: #000080">]</span><span style="COLOR: #000080">[</span>v<span style="COLOR: #000080">]</span> <span style="COLOR: #000080">-</span><span style="COLOR: #000080">=</span> inc<span style="COLOR: #000080">;  //这条边的流量减少inc</span>
num<span style="COLOR: #000080">[</span>v<span style="COLOR: #000080">]</span><span style="COLOR: #000080">[</span>u<span style="COLOR: #000080">]</span> <span style="COLOR: #000080">+</span><span style="COLOR: #000080">=</span> inc<span style="COLOR: #000080">;  //反向边的流量增加inc</span>
<span style="COLOR: #000080">}</span>
maxflow <span style="COLOR: #000080">+</span><span style="COLOR: #000080">=</span> inc<span style="COLOR: #000080">;//增加网络流的值</span>
<span style="COLOR: #000080">}</span>
<span style="COLOR: #0000ff">printf</span><span style="COLOR: #000080">(</span><span style="COLOR: #224c14">"%d\n"</span>,maxflow<span style="COLOR: #000080">)</span><span style="COLOR: #000080">;</span>
<span style="COLOR: #000080">}</span></span></pre>
</a>
<img src ="http://www.cppblog.com/klion/aggbug/126597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/klion/" target="_blank">Klion</a> 2010-09-14 15:52 <a href="http://www.cppblog.com/klion/archive/2010/09/14/126597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>USACO 3_3_1 Riding The Fences</title><link>http://www.cppblog.com/klion/archive/2010/08/13/123314.html</link><dc:creator>Klion</dc:creator><author>Klion</author><pubDate>Fri, 13 Aug 2010 03:54:00 GMT</pubDate><guid>http://www.cppblog.com/klion/archive/2010/08/13/123314.html</guid><wfw:comment>http://www.cppblog.com/klion/comments/123314.html</wfw:comment><comments>http://www.cppblog.com/klion/archive/2010/08/13/123314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/klion/comments/commentRss/123314.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/klion/services/trackbacks/123314.html</trackback:ping><description><![CDATA[<a href="http://www.nocow.cn/index.php/Translate:USACO/fence">题意</a><br>一道很裸的欧拉路径题。基本上只要知道欧拉路径的算法就可以过的。而且顶点和边数也不多。直接矩阵存就ok了。<br>对于欧拉路径的算法，<a href="http://www.cppblog.com/Files/klion/Eulerian_Tour.doc">请看这</a>(英文的,本来是网页的,不过CPP说不能传那种格式的,凑合着看吧)<br>有一点就是注意重边的情况,也就是存边和删边时不能单纯的置为1和置为0，而应该是用++和--来代替.不然重边不好处理。<br><a href="http://u.115.com/file/f9e61ee149">这里</a>上传了欧拉路径的那个HTML网页
<img src ="http://www.cppblog.com/klion/aggbug/123314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/klion/" target="_blank">Klion</a> 2010-08-13 11:54 <a href="http://www.cppblog.com/klion/archive/2010/08/13/123314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>USACO 3_2_6 Sweet Butter----最短路</title><link>http://www.cppblog.com/klion/archive/2010/08/10/122948.html</link><dc:creator>Klion</dc:creator><author>Klion</author><pubDate>Tue, 10 Aug 2010 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/klion/archive/2010/08/10/122948.html</guid><wfw:comment>http://www.cppblog.com/klion/comments/122948.html</wfw:comment><comments>http://www.cppblog.com/klion/archive/2010/08/10/122948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/klion/comments/commentRss/122948.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/klion/services/trackbacks/122948.html</trackback:ping><description><![CDATA[<a href="http://www.nocow.cn/index.php/Translate:USACO/butter">题意</a><br>一开始我想用Floyd去水水，发现水不过,第7组0.8S，第8组数据1.56S。于是想着用spfa去搞。<br>发现spfa原来这个好写,不过中间由于大错一个下标导致了1h的悲剧。。。至于spfa的介绍就不必我来说了吧，网上一搜一大把。<br>用spfa搞出来的最后一组数据用时0.19S。还过得去，不过网上有人说用spfa还可以优化，就是根据已经算出来的最短路来优化还没算出的最短路，具体实现我不是很懂，<a href="http://dantvt.spaces.live.com/blog/cns!D87988A6CAC0A480!775.entry">给个链接</a>，有兴趣的看看。(这个链接里还有几种最短路的算法效率的比较)<br>还有就是可以用heap+dij,不过这个heap最好还是自己手写，想偷懒用stl的东西有时是要以时间为代价的。有时用stl的优先队列来搞的话会超时，但是自己手写堆的话，可能会比较理想。标称给的就是heap+dij.具体实现nocow上应该有，这里就不贴了。
<img src ="http://www.cppblog.com/klion/aggbug/122948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/klion/" target="_blank">Klion</a> 2010-08-10 16:44 <a href="http://www.cppblog.com/klion/archive/2010/08/10/122948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>