﻿<?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++博客-O(1) 的小乐 </title><link>http://www.cppblog.com/sosi/</link><description>Job Hunting</description><language>zh-cn</language><lastBuildDate>Mon, 20 Apr 2026 03:16:16 GMT</lastBuildDate><pubDate>Mon, 20 Apr 2026 03:16:16 GMT</pubDate><ttl>60</ttl><item><title>算法设计4——贪心算法(3)</title><link>http://www.cppblog.com/sosi/archive/2012/11/15/195236.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Thu, 15 Nov 2012 08:38:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/11/15/195236.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/195236.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/11/15/195236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/195236.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/195236.html</trackback:ping><description><![CDATA[<p>1 聚类问题：最大间隔的K聚类。我们定义一个K聚类的间隔是处在不同聚类中的任意一对点之间的最小距离。一个自然的目标是寻求具有最大可能间隔的k聚类。 </p>  <p>这个问题的算法与Kruskal算法非常相似，首先每一个点都是一个聚类，然后依次按照Kruskal进行计算。。。相当于在Kruskal中删除了k-1条最贵的边。 </p>  <p>2&#160; 假设给定一个连通图G，假定边的费用都是不同的，G有n个顶点和m条边，指定了G的一条特定的边e，给出一个运行时间在O(m+n)的算法来确定e是否包含在G的一棵最小生成树里。 </p>  <p>算法现在就已经很显然了，我们通过从G中删除所有权比e大的边，（包括e）然后使用看一下e中的两个端的是否联通。当前仅当没有这样一条路径的时候，e属于一棵最小生成树。 </p>  <p>3 看一下最小生成树的两个性质：&#160; </p>  <p>割性质：当e是从某个集合S跨到补集V-S的最便宜的边，那么它在每一颗最小生成树里。 </p>  <p>圈性质：如果e是某个圈C上最贵的边，那么它不在最小生成树里。 </p>  <p>4 一个课后问题： </p>  <p>给定一个最短路问题，但是边权是一个到达时间的函数(边权统一为时间的量纲， 函数单调递增)，此时仍然是Dijkstra算法，Dijkstra 算法实质就是一个宽度优先搜索。 </p>  <p><a href="http://www.cppblog.com/images/cppblog_com/sosi/QQ20121115145333_72282962.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="QQ截图20121115145333" border="0" alt="QQ截图20121115145333" src="http://www.cppblog.com/images/cppblog_com/sosi/QQ20121115145333_thumb_54F25B8B.png" width="640" height="236" /></a> </p>  <p>5 给定一棵完全二叉树，然后每个边有权值。要求修改边，然后使得跟到每个叶子节点的距离相同，要求修改的和最小？给出一个算法，这个在电路设计中就是同时性的要求。 </p>  <p>这个是个非常不错的算法。还是一个递归的过程： </p>  <p><a href="http://www.cppblog.com/images/cppblog_com/sosi/T0G6CYQEEWATZESUY3JL6_54862896.jpg"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="T0G6CYQEEWAT$ZESUY3J(L6" border="0" alt="T0G6CYQEEWAT$ZESUY3J(L6" src="http://www.cppblog.com/images/cppblog_com/sosi/T0G6CYQEEWATZESUY3JL6_thumb_2005564E.jpg" width="640" height="255" /></a> </p>  <p>6&#160; </p>  <p>&#160; 给定一个连通图，他的边的费用都是不同的，证明G有唯一的一棵最小生成树。 </p>  <p>如果G有两棵最小生成树，则T 和P，必然有不同的边，把T与P不同的边加入到P中，必然形成圈。 </p><img src ="http://www.cppblog.com/sosi/aggbug/195236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-11-15 16:38 <a href="http://www.cppblog.com/sosi/archive/2012/11/15/195236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Timus 1078 SPFA</title><link>http://www.cppblog.com/sosi/archive/2012/11/10/195013.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Sat, 10 Nov 2012 06:39:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/11/10/195013.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/195013.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/11/10/195013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/195013.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/195013.html</trackback:ping><description><![CDATA[<p>之前做这个题使用的方法是Floyd其所有点的最长路，但是这个还可以使用SPFA来做，因为这个图是肯定没有正环的图，然后把所有入读为0的点，都一次性的加入到SPFA的队列或者栈中，则可以求解出一个全局最大值。然后用SPFA可以加一个父亲域，来回复我们获得的路径。</p>  <p>&#160;</p>  <div class="csharpcode">   <pre><span class="lnum">   1:  </span>&#160;</pre>

  <pre><span class="lnum">   2:  </span>#include &lt;queue&gt;</pre>

  <pre><span class="lnum">   3:  </span>#include &lt;iostream&gt;</pre>

  <pre><span class="lnum">   4:  </span>#include &lt;<span class="kwrd">string</span>.h&gt;</pre>

  <pre><span class="lnum">   5:  </span>#include &lt;stdio.h&gt;</pre>

  <pre><span class="lnum">   6:  </span>#include &lt;algorithm&gt;</pre>

  <pre><span class="lnum">   7:  </span>#include &lt;vector&gt;</pre>

  <pre><span class="lnum">   8:  </span><span class="kwrd">using</span> <span class="kwrd">namespace</span> std;</pre>

  <pre><span class="lnum">   9:  </span><span class="preproc">#define</span> V 30010      <span class="rem">// vertex</span></pre>

  <pre><span class="lnum">  10:  </span><span class="preproc">#define</span> E 150010      <span class="rem">// edge</span></pre>

  <pre><span class="lnum">  11:  </span><span class="preproc">#define</span> INF 0x3F3F3F3F</pre>

  <pre><span class="lnum">  12:  </span>&#160;</pre>

  <pre><span class="lnum">  13:  </span><span class="kwrd">struct</span> node</pre>

  <pre><span class="lnum">  14:  </span>{</pre>

  <pre><span class="lnum">  15:  </span>    <span class="kwrd">int</span> v, w, next;</pre>

  <pre><span class="lnum">  16:  </span>}pnt[E];</pre>

  <pre><span class="lnum">  17:  </span>&#160;</pre>

  <pre><span class="lnum">  18:  </span><span class="kwrd">int</span> head[V];</pre>

  <pre><span class="lnum">  19:  </span><span class="kwrd">int</span>  dis[V];</pre>

  <pre><span class="lnum">  20:  </span><span class="kwrd">bool</span> vis[V];</pre>

  <pre><span class="lnum">  21:  </span><span class="kwrd">int</span>  cnt[V];          <span class="rem">// the num of the operation of push to Quque. negatvie cycle.</span></pre>

  <pre><span class="lnum">  22:  </span><span class="kwrd">int</span> e = 0;            <span class="rem">// the index of the edge</span></pre>

  <pre><span class="lnum">  23:  </span><span class="kwrd">int</span> N ;               <span class="rem">// the num of the vertex.</span></pre>

  <pre><span class="lnum">  24:  </span><span class="kwrd">int</span> M ;               <span class="rem">// the num of edges</span></pre>

  <pre><span class="lnum">  25:  </span><span class="kwrd">int</span> src, sink;</pre>

  <pre><span class="lnum">  26:  </span><span class="kwrd">int</span> father[V];</pre>

  <pre><span class="lnum">  27:  </span><span class="kwrd">int</span> ru[V];</pre>

  <pre><span class="lnum">  28:  </span><span class="kwrd">void</span> addedge(<span class="kwrd">int</span>  u, <span class="kwrd">int</span> v, <span class="kwrd">int</span> w)</pre>

  <pre><span class="lnum">  29:  </span>{</pre>

  <pre><span class="lnum">  30:  </span>    pnt[e].v = v; pnt[e].w= w;</pre>

  <pre><span class="lnum">  31:  </span>    pnt[e].next = head[u]; head[u] = e++;</pre>

  <pre><span class="lnum">  32:  </span>}</pre>

  <pre><span class="lnum">  33:  </span><span class="kwrd">void</span> SPFA_init()</pre>

  <pre><span class="lnum">  34:  </span>{</pre>

  <pre><span class="lnum">  35:  </span>    e=0;</pre>

  <pre><span class="lnum">  36:  </span>    memset(head, -1,<span class="kwrd">sizeof</span>(head));</pre>

  <pre><span class="lnum">  37:  </span>    memset(vis, 0 ,<span class="kwrd">sizeof</span>(vis));</pre>

  <pre><span class="lnum">  38:  </span>    memset(cnt, 0 ,<span class="kwrd">sizeof</span>(cnt));</pre>

  <pre><span class="lnum">  39:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;=N; i++) dis[i] = -1;          <span class="rem">// MODIFIED</span></pre>

  <pre><span class="lnum">  40:  </span>    memset(father, -1, <span class="kwrd">sizeof</span>(father));</pre>

  <pre><span class="lnum">  41:  </span>}</pre>

  <pre><span class="lnum">  42:  </span><span class="kwrd">int</span> SPFA()</pre>

  <pre><span class="lnum">  43:  </span>{</pre>

  <pre><span class="lnum">  44:  </span>    queue&lt;<span class="kwrd">int</span>&gt; Q;</pre>

  <pre><span class="lnum">  45:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=1; i&lt;=N; i++) </pre>

  <pre><span class="lnum">  46:  </span>    {</pre>

  <pre><span class="lnum">  47:  </span>        src = i;</pre>

  <pre><span class="lnum">  48:  </span>        <span class="kwrd">if</span>(ru[i] == 0)</pre>

  <pre><span class="lnum">  49:  </span>        {</pre>

  <pre><span class="lnum">  50:  </span>            Q.push(src); vis[src] = 1; dis[src] = 0; ++cnt[src];</pre>

  <pre><span class="lnum">  51:  </span>        }</pre>

  <pre><span class="lnum">  52:  </span>    }</pre>

  <pre><span class="lnum">  53:  </span>    <span class="kwrd">while</span>(!Q.empty()) </pre>

  <pre><span class="lnum">  54:  </span>    {</pre>

  <pre><span class="lnum">  55:  </span>        <span class="kwrd">int</span> u = Q.front(); Q.pop();  vis[u] = 0;</pre>

  <pre><span class="lnum">  56:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=head[u]; i!=-1; i=pnt[i].next)</pre>

  <pre><span class="lnum">  57:  </span>        {</pre>

  <pre><span class="lnum">  58:  </span>            <span class="kwrd">int</span> v = pnt[i].v;</pre>

  <pre><span class="lnum">  59:  </span>            <span class="kwrd">if</span>( dis[v] &lt; dis[u] + pnt[i].w  )          <span class="rem">// MODIFIED</span></pre>

  <pre><span class="lnum">  60:  </span>            {</pre>

  <pre><span class="lnum">  61:  </span>                dis[v] = dis[u] + pnt[i].w;</pre>

  <pre><span class="lnum">  62:  </span>                father[v] = u;</pre>

  <pre><span class="lnum">  63:  </span>                <span class="kwrd">if</span>(!vis[v]) { Q.push(v); vis[v] = 1;}</pre>

  <pre><span class="lnum">  64:  </span>                <span class="kwrd">if</span>( ++cnt[v] &gt; N) <span class="kwrd">return</span> -1;   <span class="rem">// positive  cycle.</span></pre>

  <pre><span class="lnum">  65:  </span>            }</pre>

  <pre><span class="lnum">  66:  </span>        }</pre>

  <pre><span class="lnum">  67:  </span>    }</pre>

  <pre><span class="lnum">  68:  </span>    <span class="kwrd">if</span>(dis[sink] == -1 ) <span class="kwrd">return</span> -2;            <span class="rem">// can't from src to sink. </span></pre>

  <pre><span class="lnum">  69:  </span>    <span class="kwrd">return</span> dis[sink];</pre>

  <pre><span class="lnum">  70:  </span>}</pre>

  <pre><span class="lnum">  71:  </span>&#160;</pre>

  <pre><span class="lnum">  72:  </span><span class="kwrd">int</span> main()</pre>

  <pre><span class="lnum">  73:  </span>{</pre>

  <pre><span class="lnum">  74:  </span>    <span class="rem">//freopen(&quot;1078.txt&quot;,&quot;r&quot;,stdin);</span></pre>

  <pre><span class="lnum">  75:  </span>    scanf(<span class="str">&quot;%d&quot;</span>, &amp;N);</pre>

  <pre><span class="lnum">  76:  </span>    <span class="kwrd">int</span> a, b;</pre>

  <pre><span class="lnum">  77:  </span>    vector&lt;pair&lt;<span class="kwrd">int</span>, <span class="kwrd">int</span>&gt; &gt; C;</pre>

  <pre><span class="lnum">  78:  </span>    memset(ru, 0 ,<span class="kwrd">sizeof</span>(ru));</pre>

  <pre><span class="lnum">  79:  </span>    SPFA_init();</pre>

  <pre><span class="lnum">  80:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;N; i++)</pre>

  <pre><span class="lnum">  81:  </span>    {</pre>

  <pre><span class="lnum">  82:  </span>        <span class="kwrd">int</span> a, b;</pre>

  <pre><span class="lnum">  83:  </span>        scanf(<span class="str">&quot;%d%d&quot;</span>, &amp;a, &amp;b);</pre>

  <pre><span class="lnum">  84:  </span>        C.push_back(make_pair(a,b));</pre>

  <pre><span class="lnum">  85:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;C.size(); i++)</pre>

  <pre><span class="lnum">  86:  </span>        {</pre>

  <pre><span class="lnum">  87:  </span>            <span class="kwrd">if</span>(a&lt;C[i].first &amp;&amp; b&gt; C[i].second)</pre>

  <pre><span class="lnum">  88:  </span>            {</pre>

  <pre><span class="lnum">  89:  </span>                ru[C.size()]++;</pre>

  <pre><span class="lnum">  90:  </span>                addedge(i+1,C.size() , 1);</pre>

  <pre><span class="lnum">  91:  </span>            }</pre>

  <pre><span class="lnum">  92:  </span>            <span class="kwrd">else</span> <span class="kwrd">if</span>(a&gt; C[i].first &amp;&amp; b&lt; C[i].second)</pre>

  <pre><span class="lnum">  93:  </span>            {</pre>

  <pre><span class="lnum">  94:  </span>                ru[i+1]++;</pre>

  <pre><span class="lnum">  95:  </span>                addedge(C.size(), i+1,1);</pre>

  <pre><span class="lnum">  96:  </span>            }</pre>

  <pre><span class="lnum">  97:  </span>        }</pre>

  <pre><span class="lnum">  98:  </span>    }</pre>

  <pre><span class="lnum">  99:  </span>    SPFA();</pre>

  <pre><span class="lnum"> 100:  </span>    <span class="rem">//for(int i=1; i&lt;=N; i++) cout&lt;&lt;father[i]&lt;&lt;&quot; &quot;; cout&lt;&lt;endl;</span></pre>

  <pre><span class="lnum"> 101:  </span>    <span class="kwrd">int</span> ret  =0; <span class="kwrd">int</span> idx = -1;</pre>

  <pre><span class="lnum"> 102:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=1; i&lt;=N; i++)</pre>

  <pre><span class="lnum"> 103:  </span>    {</pre>

  <pre><span class="lnum"> 104:  </span>        <span class="kwrd">if</span>(dis[i]&gt;ret)</pre>

  <pre><span class="lnum"> 105:  </span>        {</pre>

  <pre><span class="lnum"> 106:  </span>            ret = dis[i];</pre>

  <pre><span class="lnum"> 107:  </span>            idx = i;</pre>

  <pre><span class="lnum"> 108:  </span>        }</pre>

  <pre><span class="lnum"> 109:  </span>    }</pre>

  <pre><span class="lnum"> 110:  </span>    <span class="kwrd">if</span>(ret == 0)</pre>

  <pre><span class="lnum"> 111:  </span>    {</pre>

  <pre><span class="lnum"> 112:  </span>        cout&lt;&lt;1&lt;&lt;endl;</pre>

  <pre><span class="lnum"> 113:  </span>        cout&lt;&lt;1&lt;&lt;endl;</pre>

  <pre><span class="lnum"> 114:  </span>    }</pre>

  <pre><span class="lnum"> 115:  </span>    <span class="kwrd">else</span></pre>

  <pre><span class="lnum"> 116:  </span>    {</pre>

  <pre><span class="lnum"> 117:  </span>        cout&lt;&lt;ret+1&lt;&lt;endl;</pre>

  <pre><span class="lnum"> 118:  </span>        vector&lt;<span class="kwrd">int</span>&gt; D;</pre>

  <pre><span class="lnum"> 119:  </span>        D.push_back(idx);</pre>

  <pre><span class="lnum"> 120:  </span>        <span class="kwrd">while</span>(father[idx] != -1)</pre>

  <pre><span class="lnum"> 121:  </span>        {</pre>

  <pre><span class="lnum"> 122:  </span>            D.push_back(father[idx]);</pre>

  <pre><span class="lnum"> 123:  </span>            idx = father[idx];</pre>

  <pre><span class="lnum"> 124:  </span>        }</pre>

  <pre><span class="lnum"> 125:  </span>        reverse(D.begin(), D.end());</pre>

  <pre><span class="lnum"> 126:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;D.size(); i++) cout&lt;&lt;D[i]&lt;&lt;<span class="str">&quot; &quot;</span>;</pre>

  <pre><span class="lnum"> 127:  </span>        cout&lt;&lt;endl;</pre>

  <pre><span class="lnum"> 128:  </span>    }</pre>

  <pre><span class="lnum"> 129:  </span>    <span class="kwrd">return</span> 0;</pre>

  <pre><span class="lnum"> 130:  </span>}</pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style><img src ="http://www.cppblog.com/sosi/aggbug/195013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-11-10 14:39 <a href="http://www.cppblog.com/sosi/archive/2012/11/10/195013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Timus 1078 最长路Floyd</title><link>http://www.cppblog.com/sosi/archive/2012/11/10/195008.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Sat, 10 Nov 2012 04:50:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/11/10/195008.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/195008.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/11/10/195008.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/195008.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/195008.html</trackback:ping><description><![CDATA[<p>可以把问题转换为一个有向图中求最长路的过程，需要Floyd算法来打印最长路。保存即可。</p>  <p><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></p>  <p>&#160;</p>  <div class="csharpcode">   <pre><span class="lnum">   1:  </span>&#160;</pre>

  <pre><span class="lnum">   2:  </span>#include &lt;queue&gt;</pre>

  <pre><span class="lnum">   3:  </span>#include &lt;iostream&gt;</pre>

  <pre><span class="lnum">   4:  </span>#include &lt;<span class="kwrd">string</span>.h&gt;</pre>

  <pre><span class="lnum">   5:  </span>#include &lt;stdio.h&gt;</pre>

  <pre><span class="lnum">   6:  </span><span class="kwrd">using</span> <span class="kwrd">namespace</span> std;</pre>

  <pre><span class="lnum">   7:  </span><span class="preproc">#define</span> V 505      <span class="rem">// vertex</span></pre>

  <pre><span class="lnum">   8:  </span><span class="preproc">#define</span> INF 0x3F3F3F3F</pre>

  <pre><span class="lnum">   9:  </span><span class="kwrd">int</span> N; </pre>

  <pre><span class="lnum">  10:  </span><span class="kwrd">int</span> dis[V][V];</pre>

  <pre><span class="lnum">  11:  </span><span class="kwrd">int</span> path[V][V];</pre>

  <pre><span class="lnum">  12:  </span>&#160;</pre>

  <pre><span class="lnum">  13:  </span><span class="rem">// normal distance.</span></pre>

  <pre><span class="lnum">  14:  </span><span class="kwrd">void</span> floyd()</pre>

  <pre><span class="lnum">  15:  </span>{</pre>

  <pre><span class="lnum">  16:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> k=1;k&lt;=N;k++)</pre>

  <pre><span class="lnum">  17:  </span>    {</pre>

  <pre><span class="lnum">  18:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=1;i&lt;=N;i++)</pre>

  <pre><span class="lnum">  19:  </span>        {</pre>

  <pre><span class="lnum">  20:  </span>            <span class="kwrd">for</span>(<span class="kwrd">int</span> j=1;j&lt;=N;j++)</pre>

  <pre><span class="lnum">  21:  </span>            {</pre>

  <pre><span class="lnum">  22:  </span>                <span class="kwrd">if</span>(dis[i][k]== -INF || dis[k][j] == -INF) <span class="kwrd">continue</span>;</pre>

  <pre><span class="lnum">  23:  </span>                <span class="kwrd">if</span>(dis[i][k] + dis[k][j] &gt; dis[i][j])</pre>

  <pre><span class="lnum">  24:  </span>                {</pre>

  <pre><span class="lnum">  25:  </span>                    dis[i][j] = dis[i][k] + dis[k][j];</pre>

  <pre><span class="lnum">  26:  </span>                    path[i][j] = path[i][k];</pre>

  <pre><span class="lnum">  27:  </span>                }</pre>

  <pre><span class="lnum">  28:  </span>&#160;</pre>

  <pre><span class="lnum">  29:  </span>            }</pre>

  <pre><span class="lnum">  30:  </span>        }</pre>

  <pre><span class="lnum">  31:  </span>    }</pre>

  <pre><span class="lnum">  32:  </span>}</pre>

  <pre><span class="lnum">  33:  </span><span class="kwrd">void</span> floyd_path(<span class="kwrd">int</span> i, <span class="kwrd">int</span> j)</pre>

  <pre><span class="lnum">  34:  </span>{</pre>

  <pre><span class="lnum">  35:  </span>    <span class="kwrd">int</span> k=path[i][j];</pre>

  <pre><span class="lnum">  36:  </span>    <span class="kwrd">while</span>(k!=j)</pre>

  <pre><span class="lnum">  37:  </span>    {</pre>

  <pre><span class="lnum">  38:  </span>        printf(<span class="str">&quot; %d&quot;</span>, k );</pre>

  <pre><span class="lnum">  39:  </span>        k= path[k][j];</pre>

  <pre><span class="lnum">  40:  </span>    }</pre>

  <pre><span class="lnum">  41:  </span>}</pre>

  <pre><span class="lnum">  42:  </span>&#160;</pre>

  <pre><span class="lnum">  43:  </span><span class="kwrd">int</span> main()</pre>

  <pre><span class="lnum">  44:  </span>{</pre>

  <pre><span class="lnum">  45:  </span>    <span class="rem">//freopen(&quot;1078.txt&quot;,&quot;r&quot;,stdin);</span></pre>

  <pre><span class="lnum">  46:  </span>    scanf(<span class="str">&quot;%d&quot;</span>, &amp;N);</pre>

  <pre><span class="lnum">  47:  </span>    <span class="kwrd">int</span> a, b;</pre>

  <pre><span class="lnum">  48:  </span>    vector&lt;pair&lt;<span class="kwrd">int</span>, <span class="kwrd">int</span>&gt; &gt; C;</pre>

  <pre><span class="lnum">  49:  </span>    memset(dis, 0 ,<span class="kwrd">sizeof</span>(dis));</pre>

  <pre><span class="lnum">  50:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;N; i++)</pre>

  <pre><span class="lnum">  51:  </span>    {</pre>

  <pre><span class="lnum">  52:  </span>        scanf(<span class="str">&quot;%d%d&quot;</span>, &amp;a, &amp;b);</pre>

  <pre><span class="lnum">  53:  </span>        C.push_back(make_pair(a,b));</pre>

  <pre><span class="lnum">  54:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;C.size(); i++)</pre>

  <pre><span class="lnum">  55:  </span>        {</pre>

  <pre><span class="lnum">  56:  </span>            <span class="kwrd">if</span>(a&lt;C[i].first &amp;&amp; b&gt; C[i].second)</pre>

  <pre><span class="lnum">  57:  </span>            {</pre>

  <pre><span class="lnum">  58:  </span>                dis[i+1][C.size()] = 1;</pre>

  <pre><span class="lnum">  59:  </span>                path[i+1][C.size()] = C.size();</pre>

  <pre><span class="lnum">  60:  </span>            }</pre>

  <pre><span class="lnum">  61:  </span>            <span class="kwrd">else</span> <span class="kwrd">if</span>(a&gt; C[i].first &amp;&amp; b&lt; C[i].second)</pre>

  <pre><span class="lnum">  62:  </span>            {</pre>

  <pre><span class="lnum">  63:  </span>                dis[C.size()][i+1]=1;</pre>

  <pre><span class="lnum">  64:  </span>                path[C.size()][i+1] = i+1;</pre>

  <pre><span class="lnum">  65:  </span>            }</pre>

  <pre><span class="lnum">  66:  </span>        }</pre>

  <pre><span class="lnum">  67:  </span>    }</pre>

  <pre><span class="lnum">  68:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=1; i&lt;=N; i++) <span class="kwrd">for</span>(<span class="kwrd">int</span> j=1; j&lt;=N; j++) <span class="kwrd">if</span>(dis[i][j]==0) dis[i][j]=-INF;</pre>

  <pre><span class="lnum">  69:  </span>    floyd();</pre>

  <pre><span class="lnum">  70:  </span>    <span class="kwrd">int</span> ret = 0;</pre>

  <pre><span class="lnum">  71:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=1; i&lt;=N; i++)</pre>

  <pre><span class="lnum">  72:  </span>    {</pre>

  <pre><span class="lnum">  73:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> j=1; j&lt;=N; j++)</pre>

  <pre><span class="lnum">  74:  </span>        {</pre>

  <pre><span class="lnum">  75:  </span>            <span class="kwrd">if</span>(dis[i][j] &gt; ret)</pre>

  <pre><span class="lnum">  76:  </span>            {</pre>

  <pre><span class="lnum">  77:  </span>                ret = dis[i][j];</pre>

  <pre><span class="lnum">  78:  </span>                a = i; b = j;</pre>

  <pre><span class="lnum">  79:  </span>            }</pre>

  <pre><span class="lnum">  80:  </span>        }</pre>

  <pre><span class="lnum">  81:  </span>    }</pre>

  <pre><span class="lnum">  82:  </span>    <span class="kwrd">if</span>(ret == 0) </pre>

  <pre><span class="lnum">  83:  </span>    {</pre>

  <pre><span class="lnum">  84:  </span>        cout&lt;&lt;1&lt;&lt;endl;</pre>

  <pre><span class="lnum">  85:  </span>        cout&lt;&lt;1&lt;&lt;endl;</pre>

  <pre><span class="lnum">  86:  </span>    }<span class="kwrd">else</span></pre>

  <pre><span class="lnum">  87:  </span>    {</pre>

  <pre><span class="lnum">  88:  </span>        cout&lt;&lt;ret+1&lt;&lt;endl;</pre>

  <pre><span class="lnum">  89:  </span>        cout&lt;&lt;a;</pre>

  <pre><span class="lnum">  90:  </span>        floyd_path(a,b);</pre>

  <pre><span class="lnum">  91:  </span>        cout&lt;&lt;<span class="str">&quot; &quot;</span>&lt;&lt;b&lt;&lt;endl;</pre>

  <pre><span class="lnum">  92:  </span>    }</pre>

  <pre><span class="lnum">  93:  </span>    <span class="kwrd">return</span> 0;</pre>

  <pre><span class="lnum">  94:  </span>}</pre>

  <pre><span class="lnum">  95:  </span>&#160;</pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style><img src ="http://www.cppblog.com/sosi/aggbug/195008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-11-10 12:50 <a href="http://www.cppblog.com/sosi/archive/2012/11/10/195008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 3268</title><link>http://www.cppblog.com/sosi/archive/2012/11/10/194999.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Fri, 09 Nov 2012 16:03:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/11/10/194999.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/194999.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/11/10/194999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/194999.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/194999.html</trackback:ping><description><![CDATA[<p>求从原点到达某个点之后返回，来回最长的距离是多少？ 比较基础的问题，两遍Dijkstra就可以了。</p>  <div class="csharpcode">   <pre><span class="lnum">   1:  </span>&#160;</pre>

  <pre><span class="lnum">   2:  </span>#include &lt;iostream&gt; </pre>

  <pre><span class="lnum">   3:  </span>#include &lt;vector&gt;</pre>

  <pre><span class="lnum">   4:  </span>#include &lt;algorithm&gt;</pre>

  <pre><span class="lnum">   5:  </span>#include &lt;queue&gt;</pre>

  <pre><span class="lnum">   6:  </span>#include &lt;<span class="kwrd">string</span>.h&gt;</pre>

  <pre><span class="lnum">   7:  </span>#include &lt;stdio.h&gt;</pre>

  <pre><span class="lnum">   8:  </span><span class="kwrd">using</span> <span class="kwrd">namespace</span> std;</pre>

  <pre><span class="lnum">   9:  </span>&#160;</pre>

  <pre><span class="lnum">  10:  </span><span class="preproc">#define</span> V   1005</pre>

  <pre><span class="lnum">  11:  </span><span class="preproc">#define</span> E   100005</pre>

  <pre><span class="lnum">  12:  </span><span class="preproc">#define</span> INF 329999         </pre>

  <pre><span class="lnum">  13:  </span>&#160;</pre>

  <pre><span class="lnum">  14:  </span><span class="rem">// v :the end point of an edge. w : the weight of the weight next:cluster according to the begin point of the edge</span></pre>

  <pre><span class="lnum">  15:  </span><span class="kwrd">struct</span> node</pre>

  <pre><span class="lnum">  16:  </span>{</pre>

  <pre><span class="lnum">  17:  </span>    <span class="kwrd">int</span> v, w,next;</pre>

  <pre><span class="lnum">  18:  </span>    node(<span class="kwrd">int</span> vv=0, <span class="kwrd">int</span> ww=0):v(vv),w(ww){}</pre>

  <pre><span class="lnum">  19:  </span>    <span class="kwrd">bool</span> <span class="kwrd">operator</span> &lt; (<span class="kwrd">const</span> node&amp; r) <span class="kwrd">const</span>{<span class="kwrd">return</span> w&gt; r.w;}</pre>

  <pre><span class="lnum">  20:  </span>}pnt[E],pnt1[E];</pre>

  <pre><span class="lnum">  21:  </span>&#160;</pre>

  <pre><span class="lnum">  22:  </span><span class="kwrd">int</span> e=0,N,M,s;</pre>

  <pre><span class="lnum">  23:  </span>&#160;</pre>

  <pre><span class="lnum">  24:  </span><span class="kwrd">int</span> head[V];</pre>

  <pre><span class="lnum">  25:  </span><span class="kwrd">int</span> dis[V];</pre>

  <pre><span class="lnum">  26:  </span><span class="kwrd">bool</span> vis[V];</pre>

  <pre><span class="lnum">  27:  </span><span class="kwrd">int</span> src, sink;</pre>

  <pre><span class="lnum">  28:  </span>&#160;</pre>

  <pre><span class="lnum">  29:  </span><span class="kwrd">void</span> Dijkstra()</pre>

  <pre><span class="lnum">  30:  </span>{ </pre>

  <pre><span class="lnum">  31:  </span>    priority_queue&lt;node&gt; Q; </pre>

  <pre><span class="lnum">  32:  </span>    vis[src] = 1; dis[src] = 0; </pre>

  <pre><span class="lnum">  33:  </span>    Q.push(node(src, 0)); </pre>

  <pre><span class="lnum">  34:  </span>    <span class="kwrd">for</span> (<span class="kwrd">int</span> u = src, i=1; i&lt; N; i++)                 </pre>

  <pre><span class="lnum">  35:  </span>    { </pre>

  <pre><span class="lnum">  36:  </span>        <span class="kwrd">for</span> (<span class="kwrd">int</span> j = head[u]; j != -1; j = pnt[j].next)    <span class="rem">// j is edge number.</span></pre>

  <pre><span class="lnum">  37:  </span>        { </pre>

  <pre><span class="lnum">  38:  </span>            <span class="kwrd">int</span> v = pnt[j].v;                          </pre>

  <pre><span class="lnum">  39:  </span>            <span class="kwrd">if</span> (vis[v] == 0 &amp;&amp; dis[v] &gt; dis[u] + pnt[j].w )<span class="rem">// pre is the current vertex</span></pre>

  <pre><span class="lnum">  40:  </span>            { </pre>

  <pre><span class="lnum">  41:  </span>                dis[v] = dis[u] + pnt[j].w; </pre>

  <pre><span class="lnum">  42:  </span>                Q.push(node(v, dis[v]));</pre>

  <pre><span class="lnum">  43:  </span>            } </pre>

  <pre><span class="lnum">  44:  </span>        } </pre>

  <pre><span class="lnum">  45:  </span>        <span class="kwrd">while</span> (!Q.empty() &amp;&amp; vis[Q.top().v]) Q.pop(); </pre>

  <pre><span class="lnum">  46:  </span>        <span class="kwrd">if</span> (Q.empty()) <span class="kwrd">break</span>;</pre>

  <pre><span class="lnum">  47:  </span>        vis[u = Q.top().v] = 1; Q.pop();</pre>

  <pre><span class="lnum">  48:  </span>    }</pre>

  <pre><span class="lnum">  49:  </span>} </pre>

  <pre><span class="lnum">  50:  </span><span class="kwrd">int</span> head1[V];</pre>

  <pre><span class="lnum">  51:  </span>inline <span class="kwrd">void</span> addedge1(<span class="kwrd">int</span> u, <span class="kwrd">int</span> v, <span class="kwrd">int</span> w)</pre>

  <pre><span class="lnum">  52:  </span>{</pre>

  <pre><span class="lnum">  53:  </span>    pnt1[s].v =v; pnt1[s].w = w; pnt1[s].next = head1[u]; head1[u]=s++;</pre>

  <pre><span class="lnum">  54:  </span>}</pre>

  <pre><span class="lnum">  55:  </span>inline <span class="kwrd">void</span> addedge(<span class="kwrd">int</span> u, <span class="kwrd">int</span> v, <span class="kwrd">int</span> w){ </pre>

  <pre><span class="lnum">  56:  </span>    pnt[e].v = v; pnt[e].w = w; pnt[e].next= head[u]; head[u]=e++;</pre>

  <pre><span class="lnum">  57:  </span>} </pre>

  <pre><span class="lnum">  58:  </span>&#160;</pre>

  <pre><span class="lnum">  59:  </span><span class="kwrd">void</span> Dijkstra_init()</pre>

  <pre><span class="lnum">  60:  </span>{ </pre>

  <pre><span class="lnum">  61:  </span>    e = 0; s =0;</pre>

  <pre><span class="lnum">  62:  </span>    memset(head, -1, <span class="kwrd">sizeof</span>(head)); </pre>

  <pre><span class="lnum">  63:  </span>    memset(head1, -1, <span class="kwrd">sizeof</span>(head));</pre>

  <pre><span class="lnum">  64:  </span>    memset(vis, 0, <span class="kwrd">sizeof</span>(vis));</pre>

  <pre><span class="lnum">  65:  </span>    scanf(<span class="str">&quot;%d%d&quot;</span>, &amp;N , &amp;M);</pre>

  <pre><span class="lnum">  66:  </span>    <span class="kwrd">for</span> (<span class="kwrd">int</span> i = 0; i &lt;=N; i++) dis[i] = INF; </pre>

  <pre><span class="lnum">  67:  </span>    scanf(<span class="str">&quot;%d&quot;</span>, &amp;src);</pre>

  <pre><span class="lnum">  68:  </span>    <span class="rem">//cout&lt;&lt;src&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  69:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;M; i++)</pre>

  <pre><span class="lnum">  70:  </span>    {</pre>

  <pre><span class="lnum">  71:  </span>        <span class="kwrd">int</span> a, b, c;</pre>

  <pre><span class="lnum">  72:  </span>        scanf(<span class="str">&quot;%d%d%d&quot;</span>, &amp;a, &amp;b, &amp;c);</pre>

  <pre><span class="lnum">  73:  </span>        addedge(a, b, c);</pre>

  <pre><span class="lnum">  74:  </span>        addedge1(b,a, c);</pre>

  <pre><span class="lnum">  75:  </span>    }</pre>

  <pre><span class="lnum">  76:  </span>&#160;</pre>

  <pre><span class="lnum">  77:  </span>&#160;</pre>

  <pre><span class="lnum">  78:  </span>} </pre>

  <pre><span class="lnum">  79:  </span>&#160;</pre>

  <pre><span class="lnum">  80:  </span><span class="kwrd">int</span> main()</pre>

  <pre><span class="lnum">  81:  </span>{</pre>

  <pre><span class="lnum">  82:  </span>    <span class="rem">//freopen(&quot;3268.txt&quot;,&quot;r&quot;,stdin);</span></pre>

  <pre><span class="lnum">  83:  </span>&#160;</pre>

  <pre><span class="lnum">  84:  </span>    Dijkstra_init();</pre>

  <pre><span class="lnum">  85:  </span>    Dijkstra();</pre>

  <pre><span class="lnum">  86:  </span>    <span class="kwrd">int</span> dis1[V];</pre>

  <pre><span class="lnum">  87:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;=N; i++) dis1[i] = dis[i];</pre>

  <pre><span class="lnum">  88:  </span>    <span class="rem">//for(int i=1; i&lt;=N; i++) cout&lt;&lt;dis[i]&lt;&lt;&quot; &quot;; cout&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  89:  </span>    memset(vis, 0 ,<span class="kwrd">sizeof</span>(vis));</pre>

  <pre><span class="lnum">  90:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;=N; i++) { dis[i]= INF; head[i] = head1[i];}</pre>

  <pre><span class="lnum">  91:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;M; i++)</pre>

  <pre><span class="lnum">  92:  </span>    {</pre>

  <pre><span class="lnum">  93:  </span>        pnt[i]=pnt1[i];</pre>

  <pre><span class="lnum">  94:  </span>&#160;</pre>

  <pre><span class="lnum">  95:  </span>    }</pre>

  <pre><span class="lnum">  96:  </span>    Dijkstra();</pre>

  <pre><span class="lnum">  97:  </span>    <span class="rem">//for(int i=1; i&lt;=N; i++) cout&lt;&lt;dis[i]&lt;&lt;&quot; &quot;; cout&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  98:  </span>    <span class="kwrd">int</span> ret = 0;</pre>

  <pre><span class="lnum">  99:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=1; i&lt;=N; i++) ret = max(ret, dis1[i]+dis[i]);</pre>

  <pre><span class="lnum"> 100:  </span>    cout&lt;&lt;ret&lt;&lt;endl;</pre>

  <pre><span class="lnum"> 101:  </span>    <span class="kwrd">return</span> 0;</pre>

  <pre><span class="lnum"> 102:  </span>}</pre>

  <pre><span class="lnum"> 103:  </span>&#160;</pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style><img src ="http://www.cppblog.com/sosi/aggbug/194999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-11-10 00:03 <a href="http://www.cppblog.com/sosi/archive/2012/11/10/194999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 1860 SPFA 最长路</title><link>http://www.cppblog.com/sosi/archive/2012/11/09/194997.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Fri, 09 Nov 2012 15:24:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/11/09/194997.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/194997.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/11/09/194997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/194997.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/194997.html</trackback:ping><description><![CDATA[<p>货币兑换问题，经典问题，这个问题解决的关键是发现，如果存在正环，那么一定是YES。稍微改一下SPFA，寻找一个图中的正环。</p>  <p>&#160;</p>  <div class="csharpcode">   <pre><span class="lnum">   1:  </span><span class="rem">/**</span></pre>

  <pre><span class="lnum">   2:  </span><span class="rem">search the longest path , just jude whether there are a positve cycle.</span></pre>

  <pre><span class="lnum">   3:  </span><span class="rem"></span></pre>

  <pre><span class="lnum">   4:  </span><span class="rem">*/</span></pre>

  <pre><span class="lnum">   5:  </span>&#160;</pre>

  <pre><span class="lnum">   6:  </span>#include &lt;queue&gt;</pre>

  <pre><span class="lnum">   7:  </span>#include &lt;iostream&gt;</pre>

  <pre><span class="lnum">   8:  </span>#include &lt;<span class="kwrd">string</span>.h&gt;</pre>

  <pre><span class="lnum">   9:  </span>#include &lt;stdio.h&gt;</pre>

  <pre><span class="lnum">  10:  </span><span class="kwrd">using</span> <span class="kwrd">namespace</span> std;</pre>

  <pre><span class="lnum">  11:  </span><span class="preproc">#define</span> V 3000      <span class="rem">// vertex</span></pre>

  <pre><span class="lnum">  12:  </span><span class="preproc">#define</span> E 1500      <span class="rem">// edge</span></pre>

  <pre><span class="lnum">  13:  </span><span class="preproc">#define</span> INF 1000000.0f</pre>

  <pre><span class="lnum">  14:  </span>&#160;</pre>

  <pre><span class="lnum">  15:  </span><span class="kwrd">struct</span> node</pre>

  <pre><span class="lnum">  16:  </span>{</pre>

  <pre><span class="lnum">  17:  </span>    <span class="kwrd">int</span> v, next;</pre>

  <pre><span class="lnum">  18:  </span>    <span class="kwrd">double</span> R,C,w;</pre>

  <pre><span class="lnum">  19:  </span>}pnt[E];</pre>

  <pre><span class="lnum">  20:  </span>&#160;</pre>

  <pre><span class="lnum">  21:  </span><span class="kwrd">int</span> head[V];</pre>

  <pre><span class="lnum">  22:  </span><span class="kwrd">double</span>  dis[V];</pre>

  <pre><span class="lnum">  23:  </span><span class="kwrd">bool</span> vis[V];</pre>

  <pre><span class="lnum">  24:  </span><span class="kwrd">int</span>  cnt[V];          <span class="rem">// the num of the operation of push to Quque. negatvie cycle.</span></pre>

  <pre><span class="lnum">  25:  </span><span class="kwrd">int</span> e = 0;            <span class="rem">// the index of the edge</span></pre>

  <pre><span class="lnum">  26:  </span><span class="kwrd">int</span> N ;               <span class="rem">// the num of the vertex.</span></pre>

  <pre><span class="lnum">  27:  </span><span class="kwrd">int</span> M ;               <span class="rem">// the num of edges</span></pre>

  <pre><span class="lnum">  28:  </span><span class="kwrd">int</span> src, sink;</pre>

  <pre><span class="lnum">  29:  </span><span class="kwrd">double</span> val;</pre>

  <pre><span class="lnum">  30:  </span><span class="kwrd">void</span> addedge(<span class="kwrd">int</span>  u, <span class="kwrd">int</span> v, <span class="kwrd">double</span> R, <span class="kwrd">double</span> C)</pre>

  <pre><span class="lnum">  31:  </span>{</pre>

  <pre><span class="lnum">  32:  </span>    pnt[e].v = v; pnt[e].w= 0;</pre>

  <pre><span class="lnum">  33:  </span>    pnt[e].R = R; pnt[e].C = C;</pre>

  <pre><span class="lnum">  34:  </span>    pnt[e].next = head[u]; head[u] = e++;</pre>

  <pre><span class="lnum">  35:  </span>}</pre>

  <pre><span class="lnum">  36:  </span><span class="kwrd">void</span> SPFA_init()</pre>

  <pre><span class="lnum">  37:  </span>{</pre>

  <pre><span class="lnum">  38:  </span>    e=0;</pre>

  <pre><span class="lnum">  39:  </span>    memset(head, -1,<span class="kwrd">sizeof</span>(head));</pre>

  <pre><span class="lnum">  40:  </span>    memset(vis, 0 ,<span class="kwrd">sizeof</span>(vis));</pre>

  <pre><span class="lnum">  41:  </span>    memset(cnt, 0 ,<span class="kwrd">sizeof</span>(cnt));</pre>

  <pre><span class="lnum">  42:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;=N; i++) dis[i] = 0;</pre>

  <pre><span class="lnum">  43:  </span>}</pre>

  <pre><span class="lnum">  44:  </span><span class="kwrd">int</span> SPFA()</pre>

  <pre><span class="lnum">  45:  </span>{</pre>

  <pre><span class="lnum">  46:  </span>    queue&lt;<span class="kwrd">int</span>&gt; Q;</pre>

  <pre><span class="lnum">  47:  </span>    Q.push(src); vis[src] = 1; dis[src] = val; ++cnt[src]; </pre>

  <pre><span class="lnum">  48:  </span>    <span class="kwrd">while</span>(!Q.empty()) </pre>

  <pre><span class="lnum">  49:  </span>    {</pre>

  <pre><span class="lnum">  50:  </span>        <span class="kwrd">int</span> u = Q.front(); Q.pop();  vis[u] = 0;</pre>

  <pre><span class="lnum">  51:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=head[u]; i!=-1; i=pnt[i].next)</pre>

  <pre><span class="lnum">  52:  </span>        {</pre>

  <pre><span class="lnum">  53:  </span>            <span class="kwrd">int</span> v = pnt[i].v;</pre>

  <pre><span class="lnum">  54:  </span>            pnt[i].w = (dis[u] - pnt[i].C)*pnt[i].R - dis[u];</pre>

  <pre><span class="lnum">  55:  </span>            <span class="rem">//cout&lt;&lt;u&lt;&lt;&quot; to &quot;&lt;&lt;v&lt;&lt;&quot; &quot;&lt;&lt;pnt[i].w&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  56:  </span>            <span class="kwrd">if</span>( dis[v] &lt; dis[u] + pnt[i].w  )</pre>

  <pre><span class="lnum">  57:  </span>            {</pre>

  <pre><span class="lnum">  58:  </span>                dis[v] = dis[u] + pnt[i].w;</pre>

  <pre><span class="lnum">  59:  </span>                <span class="rem">//cout&lt;&lt;u&lt;&lt;&quot; to &quot;&lt;&lt;v&lt;&lt;&quot;  &quot;&lt;&lt;pnt[i].w&lt;&lt;&quot; &quot;&lt;&lt;dis[v]&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  60:  </span>                <span class="kwrd">if</span>(!vis[v]) { Q.push(v); vis[v] = 1;}</pre>

  <pre><span class="lnum">  61:  </span>                <span class="kwrd">if</span>( ++cnt[v] &gt; N) <span class="kwrd">return</span> -1; <span class="rem">// negative cycle.</span></pre>

  <pre><span class="lnum">  62:  </span>            }</pre>

  <pre><span class="lnum">  63:  </span>        }</pre>

  <pre><span class="lnum">  64:  </span>    }</pre>

  <pre><span class="lnum">  65:  </span>    <span class="kwrd">return</span> 1;</pre>

  <pre><span class="lnum">  66:  </span>    <span class="rem">//if(dis[sink] == INF) return -2;          // can't from src to sink. </span></pre>

  <pre><span class="lnum">  67:  </span>    <span class="rem">//return dis[sink];</span></pre>

  <pre><span class="lnum">  68:  </span>}</pre>

  <pre><span class="lnum">  69:  </span>&#160;</pre>

  <pre><span class="lnum">  70:  </span><span class="kwrd">int</span> main()</pre>

  <pre><span class="lnum">  71:  </span>{</pre>

  <pre><span class="lnum">  72:  </span>    freopen(<span class="str">&quot;1860.txt&quot;</span>,<span class="str">&quot;r&quot;</span>,stdin);</pre>

  <pre><span class="lnum">  73:  </span>    scanf(<span class="str">&quot;%d%d&quot;</span>, &amp;N , &amp;M);</pre>

  <pre><span class="lnum">  74:  </span>&#160;</pre>

  <pre><span class="lnum">  75:  </span>    scanf(<span class="str">&quot;%d&quot;</span>, &amp;src);</pre>

  <pre><span class="lnum">  76:  </span>    <span class="rem">//cout&lt;&lt;src&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  77:  </span>    scanf(<span class="str">&quot;%lf&quot;</span>, &amp;val);</pre>

  <pre><span class="lnum">  78:  </span>    <span class="rem">//cout&lt;&lt;val&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  79:  </span>    SPFA_init();</pre>

  <pre><span class="lnum">  80:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;M; i++)</pre>

  <pre><span class="lnum">  81:  </span>    {</pre>

  <pre><span class="lnum">  82:  </span>        <span class="kwrd">int</span> a, b; <span class="kwrd">double</span> Rab, Cab, Rba,Cba;</pre>

  <pre><span class="lnum">  83:  </span>        scanf(<span class="str">&quot;%d%d&quot;</span>, &amp;a, &amp;b);</pre>

  <pre><span class="lnum">  84:  </span>        scanf(<span class="str">&quot;%lf%lf&quot;</span>, &amp;Rab, &amp;Cab);</pre>

  <pre><span class="lnum">  85:  </span>        scanf(<span class="str">&quot;%lf%lf&quot;</span>, &amp;Rba, &amp;Cba);</pre>

  <pre><span class="lnum">  86:  </span>        addedge(a, b,Rab, Cab);</pre>

  <pre><span class="lnum">  87:  </span>        addedge(b,a,Rba, Cba);</pre>

  <pre><span class="lnum">  88:  </span>        <span class="rem">//cout&lt;&lt;Rab&lt;&lt;&quot; &quot;&lt;&lt;Cab&lt;&lt;&quot; &quot;&lt;&lt;Rba&lt;&lt;&quot; &quot;&lt;&lt;Cba&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  89:  </span>    }</pre>

  <pre><span class="lnum">  90:  </span>    <span class="kwrd">int</span> ret = SPFA();</pre>

  <pre><span class="lnum">  91:  </span>    <span class="kwrd">if</span>(ret == -1)  cout&lt;&lt;<span class="str">&quot;YES&quot;</span>&lt;&lt;endl;</pre>

  <pre><span class="lnum">  92:  </span>    <span class="kwrd">else</span> cout&lt;&lt;<span class="str">&quot;NO&quot;</span>&lt;&lt;endl;</pre>

  <pre><span class="lnum">  93:  </span>    <span class="kwrd">return</span> 0;</pre>

  <pre><span class="lnum">  94:  </span>}</pre>
</div>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style><img src ="http://www.cppblog.com/sosi/aggbug/194997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-11-09 23:24 <a href="http://www.cppblog.com/sosi/archive/2012/11/09/194997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 3169 差分约束方程</title><link>http://www.cppblog.com/sosi/archive/2012/11/09/194994.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Fri, 09 Nov 2012 13:38:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/11/09/194994.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/194994.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/11/09/194994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/194994.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/194994.html</trackback:ping><description><![CDATA[<p>一道简单的差分约束方程，差分约束方程由Bellmanford转换而来，一组差分方程由 x-y &lt;=d 的形式，而在最短路中松弛条件有dis(x)&lt;= dis(y)+w。 所以产生了一条由y连向x的有向边，权重为d。</p>  <p><a href="https://github.com/Sosi/ProgrammingContest/blob/master/OnlineJudge/POJ/PKU3169.cpp">https://github.com/Sosi/ProgrammingContest/blob/master/OnlineJudge/POJ/PKU3169.cpp</a></p>  <div class="csharpcode">   <pre class="alt"><span class="lnum">   1:  </span>&nbsp;</pre>

  <pre><span class="lnum">   2:  </span>#include &lt;queue&gt;</pre>

  <pre class="alt"><span class="lnum">   3:  </span>#include &lt;iostream&gt;</pre>

  <pre><span class="lnum">   4:  </span>#include &lt;<span class="kwrd">string</span>.h&gt;</pre>

  <pre class="alt"><span class="lnum">   5:  </span>#include &lt;stdio.h&gt;</pre>

  <pre><span class="lnum">   6:  </span><span class="kwrd">using</span> <span class="kwrd">namespace</span> std;</pre>

  <pre class="alt"><span class="lnum">   7:  </span><span class="preproc">#define</span> MAXN 1005      <span class="rem">// vertex</span></pre>

  <pre><span class="lnum">   8:  </span><span class="preproc">#define</span> MAXM 20005      <span class="rem">// edge</span></pre>

  <pre class="alt"><span class="lnum">   9:  </span><span class="preproc">#define</span> INF 0x3F3F3F3F</pre>

  <pre><span class="lnum">  10:  </span>&nbsp;</pre>

  <pre class="alt"><span class="lnum">  11:  </span><span class="kwrd">struct</span> node</pre>

  <pre><span class="lnum">  12:  </span>{</pre>

  <pre class="alt"><span class="lnum">  13:  </span>    <span class="kwrd">int</span> v, w, next;</pre>

  <pre><span class="lnum">  14:  </span>}pnt[MAXM];</pre>

  <pre class="alt"><span class="lnum">  15:  </span>&nbsp;</pre>

  <pre><span class="lnum">  16:  </span><span class="kwrd">int</span> head[MAXN];</pre>

  <pre class="alt"><span class="lnum">  17:  </span><span class="kwrd">int</span>  dis[MAXN];</pre>

  <pre><span class="lnum">  18:  </span><span class="kwrd">bool</span> vis[MAXN];</pre>

  <pre class="alt"><span class="lnum">  19:  </span><span class="kwrd">int</span>  cnt[MAXN];       <span class="rem">// the number of the operation of push to Quque. negatvie cycle.</span></pre>

  <pre><span class="lnum">  20:  </span><span class="kwrd">int</span> num = 0;          <span class="rem">// the index of the edge</span></pre>

  <pre class="alt"><span class="lnum">  21:  </span><span class="kwrd">int</span> N ;               <span class="rem">// the number of the vertex.</span></pre>

  <pre><span class="lnum">  22:  </span><span class="kwrd">int</span> M ;               <span class="rem">// the number of edges</span></pre>

  <pre class="alt"><span class="lnum">  23:  </span><span class="kwrd">int</span> src, sink;</pre>

  <pre><span class="lnum">  24:  </span><span class="kwrd">void</span> addedge(<span class="kwrd">int</span>  u, <span class="kwrd">int</span> v, <span class="kwrd">int</span> w)</pre>

  <pre class="alt"><span class="lnum">  25:  </span>{</pre>

  <pre><span class="lnum">  26:  </span>    pnt[num].v = v; pnt[num].w= w;</pre>

  <pre class="alt"><span class="lnum">  27:  </span>    pnt[num].next = head[u]; head[u] = num++;</pre>

  <pre><span class="lnum">  28:  </span>}</pre>

  <pre class="alt"><span class="lnum">  29:  </span>&nbsp;</pre>

  <pre><span class="lnum">  30:  </span><span class="kwrd">int</span> SPFA()</pre>

  <pre class="alt"><span class="lnum">  31:  </span>{</pre>

  <pre><span class="lnum">  32:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;=N; i++)</pre>

  <pre class="alt"><span class="lnum">  33:  </span>    {</pre>

  <pre><span class="lnum">  34:  </span>        vis[i]=0; dis[i] = INF; cnt[i] = 0;</pre>

  <pre class="alt"><span class="lnum">  35:  </span>    }</pre>

  <pre><span class="lnum">  36:  </span>&nbsp;</pre>

  <pre class="alt"><span class="lnum">  37:  </span>    queue&lt;<span class="kwrd">int</span>&gt; Q;</pre>

  <pre><span class="lnum">  38:  </span>    Q.push(src); vis[src] = 1; dis[src] = 0; ++cnt[src]; </pre>

  <pre class="alt"><span class="lnum">  39:  </span>    <span class="kwrd">while</span>(!Q.empty()) </pre>

  <pre><span class="lnum">  40:  </span>    {</pre>

  <pre class="alt"><span class="lnum">  41:  </span>        <span class="kwrd">int</span> u = Q.front(); Q.pop();  vis[u] = 0;</pre>

  <pre><span class="lnum">  42:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=head[u]; i!=-1; i=pnt[i].next)</pre>

  <pre class="alt"><span class="lnum">  43:  </span>        {</pre>

  <pre><span class="lnum">  44:  </span>            <span class="kwrd">int</span> v = pnt[i].v;</pre>

  <pre class="alt"><span class="lnum">  45:  </span>            <span class="kwrd">if</span>( dis[v] &gt; dis[u] + pnt[i].w  )</pre>

  <pre><span class="lnum">  46:  </span>            {</pre>

  <pre class="alt"><span class="lnum">  47:  </span>                dis[v] = dis[u] + pnt[i].w;</pre>

  <pre><span class="lnum">  48:  </span>                <span class="kwrd">if</span>(!vis[v]) {Q.push(v); vis[v] = 1;}</pre>

  <pre class="alt"><span class="lnum">  49:  </span>                <span class="kwrd">if</span>( ++cnt[v] &gt; N) <span class="kwrd">return</span> -1; <span class="rem">// negative cycle.</span></pre>

  <pre><span class="lnum">  50:  </span>            }</pre>

  <pre class="alt"><span class="lnum">  51:  </span>        }</pre>

  <pre><span class="lnum">  52:  </span>    }</pre>

  <pre class="alt"><span class="lnum">  53:  </span>    <span class="kwrd">if</span>(dis[sink] == INF) <span class="kwrd">return</span> -2; <span class="rem">// can't from src to sink.</span></pre>

  <pre><span class="lnum">  54:  </span>    <span class="kwrd">return</span> dis[sink];</pre>

  <pre class="alt"><span class="lnum">  55:  </span>}</pre>

  <pre><span class="lnum">  56:  </span>&nbsp;</pre>

  <pre class="alt"><span class="lnum">  57:  </span><span class="kwrd">int</span> main()</pre>

  <pre><span class="lnum">  58:  </span>{</pre>

  <pre class="alt"><span class="lnum">  59:  </span>    <span class="kwrd">int</span> ml,md;</pre>

  <pre><span class="lnum">  60:  </span>    <span class="kwrd">while</span>(scanf(<span class="str">"%d%d%d"</span>, &amp;N , &amp;ml, &amp;md)!= EOF)</pre>

  <pre class="alt"><span class="lnum">  61:  </span>    {</pre>

  <pre><span class="lnum">  62:  </span>        num = 0;</pre>

  <pre class="alt"><span class="lnum">  63:  </span>        memset(head, -1, <span class="kwrd">sizeof</span>(head)); </pre>

  <pre><span class="lnum">  64:  </span>        <span class="kwrd">int</span> a, b, c;</pre>

  <pre class="alt"><span class="lnum">  65:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;ml; i++)</pre>

  <pre><span class="lnum">  66:  </span>        {</pre>

  <pre class="alt"><span class="lnum">  67:  </span>            scanf(<span class="str">"%d%d%d"</span>, &amp;a, &amp;b, &amp;c);</pre>

  <pre><span class="lnum">  68:  </span>            <span class="kwrd">if</span>(a&gt;b) swap(a,b);</pre>

  <pre class="alt"><span class="lnum">  69:  </span>            addedge(a, b,c);</pre>

  <pre><span class="lnum">  70:  </span>        }</pre>

  <pre class="alt"><span class="lnum">  71:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;md; i++)</pre>

  <pre><span class="lnum">  72:  </span>        {</pre>

  <pre class="alt"><span class="lnum">  73:  </span>            scanf(<span class="str">"%d%d%d"</span>, &amp;a, &amp;b, &amp;c);</pre>

  <pre><span class="lnum">  74:  </span>            <span class="kwrd">if</span>(a&lt;b) swap(a,b);</pre>

  <pre class="alt"><span class="lnum">  75:  </span>            addedge(a, b, -c);</pre>

  <pre><span class="lnum">  76:  </span>        }</pre>

  <pre class="alt"><span class="lnum">  77:  </span>        src = 1; sink = N;</pre>

  <pre><span class="lnum">  78:  </span>        printf(<span class="str">"%d\n"</span>, SPFA());</pre>

  <pre class="alt"><span class="lnum">  79:  </span>    }</pre>

  <pre><span class="lnum">  80:  </span>    <span class="kwrd">return</span> 0;</pre>

  <pre class="alt"><span class="lnum">  81:  </span>}</pre>
</div>


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }<img src ="http://www.cppblog.com/sosi/aggbug/194994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-11-09 21:38 <a href="http://www.cppblog.com/sosi/archive/2012/11/09/194994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ 3159 SPFA</title><link>http://www.cppblog.com/sosi/archive/2012/11/09/194992.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Fri, 09 Nov 2012 13:15:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/11/09/194992.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/194992.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/11/09/194992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/194992.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/194992.html</trackback:ping><description><![CDATA[<p>给定一个图，（V&#160; 3*10^4， E 1.5*10^5）,如此大规模的图，求一个最短路，只能使用SPFA（使用栈进行优化）</p>  <p><a href="https://github.com/Sosi/ProgrammingContest/blob/master/OnlineJudge/POJ/PKU3159.cpp">https://github.com/Sosi/ProgrammingContest/blob/master/OnlineJudge/POJ/PKU3159.cpp</a></p>  <div class="csharpcode">   <pre><span class="lnum">   1:  </span>#include &lt;queue&gt;</pre>

  <pre><span class="lnum">   2:  </span>#include &lt;iostream&gt;</pre>

  <pre><span class="lnum">   3:  </span>#include &lt;<span class="kwrd">string</span>.h&gt;</pre>

  <pre><span class="lnum">   4:  </span>#include &lt;stdio.h&gt;</pre>

  <pre><span class="lnum">   5:  </span><span class="kwrd">using</span> <span class="kwrd">namespace</span> std;</pre>

  <pre><span class="lnum">   6:  </span><span class="preproc">#define</span> MAXN 30010      <span class="rem">// vertex</span></pre>

  <pre><span class="lnum">   7:  </span><span class="preproc">#define</span> MAXM 150010      <span class="rem">// edge</span></pre>

  <pre><span class="lnum">   8:  </span><span class="preproc">#define</span> INF 0x3F3F3F3F</pre>

  <pre><span class="lnum">   9:  </span>&#160;</pre>

  <pre><span class="lnum">  10:  </span><span class="kwrd">struct</span> node</pre>

  <pre><span class="lnum">  11:  </span>{</pre>

  <pre><span class="lnum">  12:  </span>    <span class="kwrd">int</span> v, w, next;</pre>

  <pre><span class="lnum">  13:  </span>}pnt[MAXM];</pre>

  <pre><span class="lnum">  14:  </span>&#160;</pre>

  <pre><span class="lnum">  15:  </span><span class="kwrd">int</span> head[MAXN];</pre>

  <pre><span class="lnum">  16:  </span><span class="kwrd">int</span>  dis[MAXN];</pre>

  <pre><span class="lnum">  17:  </span><span class="kwrd">bool</span> vis[MAXN];</pre>

  <pre><span class="lnum">  18:  </span><span class="kwrd">int</span>  cnt[MAXN];       <span class="rem">// the number of the operation of push to Quque. negatvie cycle.</span></pre>

  <pre><span class="lnum">  19:  </span><span class="kwrd">int</span> num = 0;          <span class="rem">// the index of the edge</span></pre>

  <pre><span class="lnum">  20:  </span><span class="kwrd">int</span> N ;               <span class="rem">// the number of the vertex.</span></pre>

  <pre><span class="lnum">  21:  </span><span class="kwrd">int</span> M ;               <span class="rem">// the number of edges</span></pre>

  <pre><span class="lnum">  22:  </span><span class="kwrd">int</span> src, sink;</pre>

  <pre><span class="lnum">  23:  </span><span class="kwrd">void</span> addedge(<span class="kwrd">int</span>  u, <span class="kwrd">int</span> v, <span class="kwrd">int</span> w)</pre>

  <pre><span class="lnum">  24:  </span>{</pre>

  <pre><span class="lnum">  25:  </span>    pnt[num].v = v; pnt[num].w= w;</pre>

  <pre><span class="lnum">  26:  </span>    pnt[num].next = head[u]; head[u] = num++;</pre>

  <pre><span class="lnum">  27:  </span>}</pre>

  <pre><span class="lnum">  28:  </span>&#160;</pre>

  <pre><span class="lnum">  29:  </span><span class="kwrd">int</span> SPFA()</pre>

  <pre><span class="lnum">  30:  </span>{</pre>

  <pre><span class="lnum">  31:  </span>    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;=N; i++)</pre>

  <pre><span class="lnum">  32:  </span>    {</pre>

  <pre><span class="lnum">  33:  </span>        vis[i]=0; dis[i] = INF; cnt[i] = 0;</pre>

  <pre><span class="lnum">  34:  </span>    }</pre>

  <pre><span class="lnum">  35:  </span>&#160;</pre>

  <pre><span class="lnum">  36:  </span>    <span class="kwrd">int</span> Q[MAXM], top=1;</pre>

  <pre><span class="lnum">  37:  </span>    Q[0] = src; vis[src] = 1;</pre>

  <pre><span class="lnum">  38:  </span>    dis[src] = 0;</pre>

  <pre><span class="lnum">  39:  </span>    <span class="kwrd">while</span>(top)</pre>

  <pre><span class="lnum">  40:  </span>    {</pre>

  <pre><span class="lnum">  41:  </span>        <span class="kwrd">int</span> u = Q[--top]; vis[u] = 0;</pre>

  <pre><span class="lnum">  42:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i = head[u]; i!=-1; i=pnt[i].next)</pre>

  <pre><span class="lnum">  43:  </span>        {</pre>

  <pre><span class="lnum">  44:  </span>            <span class="kwrd">int</span> v = pnt[i].v;</pre>

  <pre><span class="lnum">  45:  </span>            <span class="kwrd">if</span>(dis[v]&gt; dis[u] + pnt[i].w )</pre>

  <pre><span class="lnum">  46:  </span>            {</pre>

  <pre><span class="lnum">  47:  </span>                dis[v]= dis[u] +pnt[i].w;</pre>

  <pre><span class="lnum">  48:  </span>                <span class="kwrd">if</span>(!vis[v])</pre>

  <pre><span class="lnum">  49:  </span>                {</pre>

  <pre><span class="lnum">  50:  </span>                    Q[top++] = v; vis[v]= 1;</pre>

  <pre><span class="lnum">  51:  </span>                }</pre>

  <pre><span class="lnum">  52:  </span>            }</pre>

  <pre><span class="lnum">  53:  </span>&#160;</pre>

  <pre><span class="lnum">  54:  </span>        }</pre>

  <pre><span class="lnum">  55:  </span>    }</pre>

  <pre><span class="lnum">  56:  </span>&#160;</pre>

  <pre><span class="lnum">  57:  </span>&#160;</pre>

  <pre><span class="lnum">  58:  </span>&#160;</pre>

  <pre><span class="lnum">  59:  </span>    <span class="kwrd">return</span> dis[sink];</pre>

  <pre><span class="lnum">  60:  </span>}</pre>

  <pre><span class="lnum">  61:  </span>&#160;</pre>

  <pre><span class="lnum">  62:  </span><span class="kwrd">int</span> main()</pre>

  <pre><span class="lnum">  63:  </span>{</pre>

  <pre><span class="lnum">  64:  </span>    <span class="rem">//freopen(&quot;3159.txt&quot;, &quot;r&quot;, stdin);</span></pre>

  <pre><span class="lnum">  65:  </span>    <span class="kwrd">while</span>(scanf(<span class="str">&quot;%d%d&quot;</span>, &amp;N , &amp;M)!= EOF)</pre>

  <pre><span class="lnum">  66:  </span>    {</pre>

  <pre><span class="lnum">  67:  </span>        num = 0;</pre>

  <pre><span class="lnum">  68:  </span>        memset(head, -1, <span class="kwrd">sizeof</span>(head)); </pre>

  <pre><span class="lnum">  69:  </span>        <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;M; i++)</pre>

  <pre><span class="lnum">  70:  </span>        {</pre>

  <pre><span class="lnum">  71:  </span>            <span class="kwrd">int</span> a, b, c;</pre>

  <pre><span class="lnum">  72:  </span>            scanf(<span class="str">&quot;%d%d%d&quot;</span>, &amp;a, &amp;b, &amp;c);</pre>

  <pre><span class="lnum">  73:  </span>            addedge(a, b,c);</pre>

  <pre><span class="lnum">  74:  </span>        }</pre>

  <pre><span class="lnum">  75:  </span>        <span class="rem">//cout&lt;&lt;num&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  76:  </span>        src = 1; sink = N;</pre>

  <pre><span class="lnum">  77:  </span>        <span class="rem">//cout&lt;&lt;&quot;src &quot;&lt;&lt;src&lt;&lt;&quot; sink &quot;&lt;&lt;N&lt;&lt;endl;</span></pre>

  <pre><span class="lnum">  78:  </span>        printf(<span class="str">&quot;%d\n&quot;</span>, SPFA());</pre>

  <pre><span class="lnum">  79:  </span>    }</pre>

  <pre><span class="lnum">  80:  </span>    <span class="kwrd">return</span> 0;</pre>

  <pre><span class="lnum">  81:  </span>}</pre>
</div>
<style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style><img src ="http://www.cppblog.com/sosi/aggbug/194992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-11-09 21:15 <a href="http://www.cppblog.com/sosi/archive/2012/11/09/194992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>算法设计5——分治策略 （1）</title><link>http://www.cppblog.com/sosi/archive/2012/10/26/193894.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Fri, 26 Oct 2012 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/10/26/193894.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/193894.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/10/26/193894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/193894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/193894.html</trackback:ping><description><![CDATA[<p>1 对于分治策略中，分解容易合成较为复杂的情况，往往都需要子集有序这样一个条件。</p>  <p>2 分析递归式的方法一般都是看主定理，主定理其实只需要记住一点就OK，logba.</p>  <p><a href="http://www.cppblog.com/images/cppblog_com/sosi/QQ20121026111232_50CF6318.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="QQ截图20121026111232" border="0" alt="QQ截图20121026111232" src="http://www.cppblog.com/images/cppblog_com/sosi/QQ20121026111232_thumb_571639A6.png" width="640" height="247" /></a></p>  <p>如果不记得主定理，那么就需要分析递归式。</p>  <p>&#160;&#160;&#160; 求解递归式的最直接的方法是按照最初几级的运行时间展开递归式，找出当递归式展开时继续进行的模式。然后在递归的所有级上求和，从而得到总的运行时间。</p>  <p>&#160;&#160;&#160; 求解递归式的第二个方法是一开始对解有一个猜想，把它代入递推关系，检查其是否正确。</p>  <p>3 平面几何中找最近邻点对的问题，首先是对平面内所有点按照x坐标排序(很多的平面几何问题，为了降低复杂度都需要排序，后面看到一个MIT的题目，也需要对点进行极角排序)。然后分治，最后问题的关键是合并，取两个子问题中的最短距离作为/theta 中间带的衡量标准。因为要求中间带的可能的更短距离，所以所有点考虑的相邻格子数有限，且每个格子只能有一个点。</p>  <p>我觉得上面那个Merge那一步是整个算法的最核心和最关键的地方！！</p>  <p>4 大整数乘法问题，给出了一个递归的方案。X*Y，把x分为前后两部分，Y分为前后两部分，交叉相乘的部分改成了一个(xh+xl)*(yh+yl)-xhyh-xlyl的过程。递归变成了 T(n)&lt;= 3T(2/n)+cn .矩阵乘法问题也是类似的一个技巧。大多停留在理论阶段。</p>  <p>下面是几个练习题：</p>  <p>1 MIT的一个练习题：</p>  <p>平面内给2N个点，无三点共线，分为两类，一类是红点（N个），一类是绿点(N个)。给出一个红点和绿点的连线方案，要求连线线段互不相交。算法复杂度O(n^2logn)</p>  <p>首先O(nlogn)找出分类面，分类面两边红点绿点个数分别相等。方法是首先极角排序，如果极点是红点，从小到大找到第一个绿点个数大于红点个数的点。连线即为分界面。递归解决两个子问题。</p>  <p>最坏情况是一个子问题退化为空，此时复杂度为O(n^2logn).</p>  <p>2 给N个数据，是一个单峰函数。O(logn)时间内求此单峰函数的极值。</p>  <p>每一次探查，探查3个点。然后二分找。</p>  <p>3 求N个数的逆序对问题，只不过变形为i&lt;j&#160; ai&gt;2*aj 才认为是逆序对。这个问题有一个陷阱。就是要进行两遍Merge，第一遍是求逆序对。第二遍是排序合并。&#160; 这个一定要想清楚啊！！</p>  <p>4 有一组N张卡，求一个方法来探测是否有大于N/2张卡等价。操作只有一种，即比较两张卡是否等价。</p>  <p><a href="http://www.cppblog.com/images/cppblog_com/sosi/QQ20121026113419_35B6940A.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="QQ截图20121026113419" border="0" alt="QQ截图20121026113419" src="http://www.cppblog.com/images/cppblog_com/sosi/QQ20121026113419_thumb_4E46315A.png" width="640" height="278" /></a></p>  <p>5 给一个N*N的4连通网格图，O(n)时间内确定找到一个局部极小值。</p>  <p><a href="http://www.cppblog.com/images/cppblog_com/sosi/QQ20121026113656_7BC7511D.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="QQ截图20121026113656" border="0" alt="QQ截图20121026113656" src="http://www.cppblog.com/images/cppblog_com/sosi/QQ20121026113656_thumb_22293469.png" width="540" height="480" /></a></p>  <p>思想就是先探测最外圈，然后探测次外圈，然后找中间两条分割线，再找分成的四个小区域的最外圈。可以找到一个局部极小值。</p><img src ="http://www.cppblog.com/sosi/aggbug/193894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-10-26 11:41 <a href="http://www.cppblog.com/sosi/archive/2012/10/26/193894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一道网易游戏笔试题</title><link>http://www.cppblog.com/sosi/archive/2012/10/23/193719.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Tue, 23 Oct 2012 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/10/23/193719.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/193719.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/10/23/193719.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/193719.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/193719.html</trackback:ping><description><![CDATA[<p>题目：英雄升级，从0级升到1级，概率100%。</p>  <p>从1级升到2级，有1/3的可能成功；1/3的可能停留原级；1/3的可能下降到0级；    <br />从2级升到3级，有1/9的可能成功；4/9的可能停留原级；4/9的可能下降到1级。     <br />每次升级要花费一个宝石，不管成功还是停留还是降级。     <br />求英雄从0级升到3级平均花费的宝石数目。</p>  <p>这个题目秒杀了一大片，一开始看到这个题目，立刻反应出来的是自动机DP，然后就朝着自动机DP去想，很快一个公式就可以搞出来。</p>  <p>dp[i][k]表示k步之后在i级的概率。</p>  <p>dp[0][k] = 1/3*dp[1][k-1];</p>  <p>dp[1][k] = dp[0][k-1]+1/3*dp[1][k-1] + 4/9*dp[2][k-1]</p>  <p>dp[2][k] = 1/3*dp[1][k-1] + 4/9* dp[2][k-1];</p>  <p>dp[3][k]= 1/9*dp[2][k-1];</p>  <p>然后此递推式可以写成矩阵乘法的形式，最后的结果就是求/Sigma (k+1)/9*dp[2][k]; 这个矩阵可以转换为对角阵，然后可以求出其通项公式等等。。。其实这个问题是线性差分方程组的解法。。。还要求特征值 + Jordan标准型bulalalalala。。。。我觉得要算出一个解析解的话果断是跪了。。。用Matlab跑了一下：</p>  <p>A =</p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1/3&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 0&#160;&#160;&#160;&#160;&#160;&#160; </p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 1&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1/3&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4/9&#160;&#160;&#160;&#160; </p>  <p>&#160;&#160;&#160;&#160;&#160;&#160; 0&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 1/3&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 4/9&#160; </p>  <p>&gt;&gt; ret =0;</p>  <p>&gt;&gt; for k=1:1000</p>  <p>ret = ret+ (k+1)/9*[0 0 1]*A^k*[1 0 0]';</p>  <p>end</p>  <p>&gt;&gt; ret</p>  <p>ret =</p>  <p>&#160;&#160;&#160;&#160;&#160; 30&#160; </p>  <p>竟然是整数30.。。被赤果果得鄙视智商了。。。</p>  <p>蛋疼的用C++再跑一遍：</p>  <pre class="csharpcode">#include &lt;stdio.h&gt;
#include &lt;iostream&gt;
<span class="kwrd">using</span> <span class="kwrd">namespace</span> std;

<span class="kwrd">double</span> dp[4];
<span class="kwrd">double</span> nextdp[4];
<span class="kwrd">int</span> main()
{
    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;4; i++) dp[i]=0.0f;
    dp[0]=1.0f;
    <span class="kwrd">double</span> ret=0.0f;
    <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;100000000; i++)
    {
        <span class="kwrd">for</span>(<span class="kwrd">int</span> j=0; j&lt;4; j++) nextdp[j]=0.0f;
        nextdp[0]= 1/3.0*dp[1];
        nextdp[1]=1/3.0*dp[1]+dp[0]+4/9.0*dp[2];
        nextdp[2]=4/9.0*dp[2]+1/3.0*dp[1];
        nextdp[3]=1/9.0*dp[2];
        ret+=i*dp[3];
        <span class="kwrd">for</span>(<span class="kwrd">int</span> j=0; j&lt;4; j++)    dp[j]=nextdp[j];
        <span class="kwrd">if</span>(i%1000000==0)
        {
            cout&lt;&lt;i&lt;&lt;<span class="str">&quot; &quot;</span>;
            printf(<span class="str">&quot;%d  %.4f\n&quot;</span>,i, ret);
        }
    }
    <span class="kwrd">return</span> 0;
}</pre>
<style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>

<p>还是30.。。</p>

<p>于是想到有没有简单的方法。。。其实可以观察到当趋于无穷的时候，此系统的期望的概率转移是趋于稳定的！其实任何系统在无穷步之后，都是期望稳定的！！(废话,但很重要！)</p>

<p>所以，从0 到1 所需要的期望步数很简单就是1. 从1到2的期望步数假设是X ，则在走了一步之后，我们分情况讨论所处位置。可以列出&#160; X = 1+ 1/3*X + 1/3*(1+X)&#160; 所以X=4 ,从1 都2 的期望步数是4. 同理，从2-3 X = 1+ 4/9*X + 4/9*(4+X)&#160;&#160; X =25. 从2到3的期望步数是25. 所以从0到3的期望步数是 30.。。。。。。。</p>

<p>坑爹啊！！！！！！！！！！！！</p>

<p>使用第一种思路可以求，问题是那个矩阵A太坑爹。。。看看他的特征值。。。。eig(A)</p>

<p>ans =</p>

<p>&#160;&#160; -1588/3201&#160; </p>

<p>&#160;&#160;&#160; 1072/3461&#160; </p>

<p>&#160;&#160;&#160;&#160; 457/474&#160;&#160; </p>

<p>还要带着n次方去求解dp[2][k]的通项。。。杀了我吧。。第二种方法是解决这类问题的万金油啊。反正系统达到稳态，那就直接上稳态公式吧。其实求解差分方程组的解法中，隐含使用的条件就是稳态方程。。。殊归同途啊。。。</p><img src ="http://www.cppblog.com/sosi/aggbug/193719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-10-23 11:39 <a href="http://www.cppblog.com/sosi/archive/2012/10/23/193719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SRM 304 U</title><link>http://www.cppblog.com/sosi/archive/2012/06/01/177103.html</link><dc:creator>Sosi</dc:creator><author>Sosi</author><pubDate>Fri, 01 Jun 2012 10:55:00 GMT</pubDate><guid>http://www.cppblog.com/sosi/archive/2012/06/01/177103.html</guid><wfw:comment>http://www.cppblog.com/sosi/comments/177103.html</wfw:comment><comments>http://www.cppblog.com/sosi/archive/2012/06/01/177103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/sosi/comments/commentRss/177103.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/sosi/services/trackbacks/177103.html</trackback:ping><description><![CDATA[<p>DIV2 1000</p>  <p>给定一个凸N变形,可以调整任意多个顶点,但是距离只能是1 ,不能调整两个相邻的顶点,求变化之后的多边形的最大增加的面积是多少?</p>  <p>&#160;</p>  <p>这个问题是一个动态规划问题,为了使问题能够达到线性而不是圆形循环的,我们需要考虑3中情况. 一开始写了一个贪心的枚举,但能够找到反例.</p>  <p>&#160;</p>  <pre class="csharpcode"><span class="kwrd">double</span> dis(<span class="kwrd">double</span> x1, <span class="kwrd">double</span> y1, <span class="kwrd">double</span> x2, <span class="kwrd">double</span> y2)
{
    <span class="kwrd">return</span> sqrt((x1-x2)*(x1-x2)+ (y1-y2)*(y1-y2));
}
<span class="kwrd">class</span> PolyMove
{
    <span class="kwrd">public</span>:
        <span class="kwrd">double</span> addedArea(vector &lt;<span class="kwrd">int</span>&gt; x, vector &lt;<span class="kwrd">int</span>&gt; y)
        {
            <span class="rem">// It is a dynamic programming problem</span>
            <span class="kwrd">int</span> n = x.size();
            <span class="kwrd">double</span> ret = 0.0f;
            vector&lt;<span class="kwrd">double</span>&gt; best(n, 0.0);

            <span class="rem">// first case</span>
            best[0]=0.0f; best[1]=0.0f;
            <span class="kwrd">for</span>(<span class="kwrd">int</span> i=2; i&lt;n; i++)
                best[i]= max(best[i-1], best[i-2]+ dis(x[i-2], y[i-2], x[i], y[i])*0.5f);
            ret = best[n-1];

            <span class="rem">//second case</span>
            <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;n; i++) best[i]=0.0f;
            best[0]=0.0f; best[1]= dis(x[n-1], y[n-1], x[1],y[1])*0.5f;
            best[2]=best[1];
            <span class="kwrd">for</span>(<span class="kwrd">int</span> i=3; i&lt;n; i++)
                best[i]= max(best[i-1], best[i-2]+ dis(x[i-2], y[i-2], x[i], y[i])*0.5f);

           ret = max(best[n-1], ret);


            <span class="rem">// third case&lt;F5&gt;</span>
            <span class="kwrd">for</span>(<span class="kwrd">int</span> i=0; i&lt;n; i++) best[i]=0.0f;
            best[0]=  dis(x[n-2], y[n-2], x[0], y[0])*0.5f;
            best[1]=best[0];
            <span class="kwrd">for</span>(<span class="kwrd">int</span> i=2; i&lt;n-1; i++)
                best[i]= max(best[i-1], best[i-2]+  dis(x[i-2], y[i-2], x[i], y[i])*0.5f);
            ret = max(ret , best[n-2]);

            <span class="kwrd">return</span> ret;
        }

};</pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style><img src ="http://www.cppblog.com/sosi/aggbug/177103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/sosi/" target="_blank">Sosi</a> 2012-06-01 18:55 <a href="http://www.cppblog.com/sosi/archive/2012/06/01/177103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>