﻿<?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++博客-我要一步一步往上爬</title><link>http://www.cppblog.com/apple365/</link><description>蜗牛</description><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 07:21:06 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 07:21:06 GMT</pubDate><ttl>60</ttl><item><title>关于</title><link>http://www.cppblog.com/apple365/archive/2008/11/29/68200.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Sat, 29 Nov 2008 15:42:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/29/68200.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/68200.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/29/68200.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/68200.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/68200.html</trackback:ping><description><![CDATA[<center style="COLOR: #000000">一&nbsp;&nbsp;&nbsp;&nbsp;ACM<wbr> <wbr></center><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp; 如果说把ACM<wbr>比作一位恋人，那么我们就是前世五百次的回眸，才换来今生的一次擦肩而过了。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 暑假，去了趟广州实习，回来后就到学校开始省赛的集训。从八月十日号到现在，我在不分白天黑夜的敲题，学算法。《算法导论》已被我借了快一年了。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 一路走来，感慨颇多，有心酸，也有快乐。</span> <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 有时会因为提交一个题目，从早上一直WA<wbr>到下午，饿了，就那样挺着，不AC<wbr>不罢休。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 省赛之前，学校还有几个队员有的时候交流一下，而现在就只有我的伙伴也只有百度和谷歌。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 省赛，早已预见的结果，我要的只是的进步。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 见识过很多牛人，学习了很多的算法，也敲过上万行的代码。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 在湖大的网站上敲了150<wbr>道题目，后来就转北大的POJ<wbr>了。我的打算是敲完这个学期，至少要敲200<wbr>以上，挤进1000<wbr>。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 在算法的海洋里，我这小小的蜗牛，也只有一天一天的努力往上爬，不知道何时才能看到那些灿烂的阳光。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 也许，阳光早已洒落在过程里了。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 有时候会想，如果我早一点接触ACM,<wbr>今天会不会牛以来呢？如果我在一所重点大学，我的ACM<wbr>生涯又会怎样呢？如果&#8230;&#8230;。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 可是生活没有如果，刚开始相恋，我就要毕业了。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 有些遗憾，但也不悔，在我有生之年，为之奋斗过。 <wbr><br>
<center><br><br>二&nbsp;&nbsp;生活 <wbr></center>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11<wbr>月，有些人的影子开始模糊。就这样吧，让生活的流水把那些往事都带走。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 很少去上课，估计每节课出勤的同学不会超过两位数。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 但我很珍惜这段最后的学校生活，可以舒服的睡觉，可以自由的敲题，可以轻松的写字，可以不管那些关于经济危机而带来的就业危机，可以放肆的像个孩子。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 至少在没有毕业之前我还是一个学生，但很快就不是了。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 走入社会，工作，我就要承担起一份责任了。亲爱的爸爸妈妈，为了我苦了大半辈子。我要努力挣钱，让我们的日子过的好点。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 朋友们，这段联系少了，其实我也不想这样。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 天冷了，整天一个人对这电脑，有点想回家了。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;生活很简单，每天睡到九点起床，忙活一下卫生，就开电脑，在北大的题海里遨游了，无边无际。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 中午，匆忙的吃个快餐。泡杯咖啡，打开窗帘，晒会儿太阳，继续做题。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 晚上的时候，跑到学校食堂吃顿饭。然后在夜幕下，一个人游荡。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 我很喜欢去操场，那些空旷与寂寥，是狂欢过后一个人悲伤。听着广播里《旋木》，王菲的空灵与纯粹。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 极目远眺，北方的天空有两颗闪亮的星星，不知道他们隔了有多远，有没有见证过所谓的永恒。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 回来后，继续敲题过午夜。 <wbr><br><br>
<center>三&nbsp;&nbsp;神奇 <wbr></center>&nbsp;&nbsp;&nbsp;&nbsp; 一个人的时候，思想会很活跃，也想过很多的问题。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 为什么我会来到这个星球上，并且是迟不来，晚不来，偏偏在这个时候来了呢？ <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 在我没来到这个世界来之前的那么多年，世界是个什么样子呢？历史上那么多的人，他们都死了，到底他们有过怎样的生活？&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 是什么力量产生了生命？怎么就有了我？ 太神奇了！<wbr> <br>&nbsp;&nbsp;&nbsp;&nbsp; 未来会变成什么样子呢？一百年，一千年，到时候我们都不在了。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 一想到我们都会死，就会很悲伤，那些无可奈何的悲伤。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 以前从来想过的问题，随着爷爷奶奶的去世，久久的会在心里缠绕着。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 悲伤，是因为害怕着失去。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 也许，活着就仅仅只是为了活着而活着，一场游戏一场梦，管那么多干嘛呢！&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 有梦就做，有酒就醉，痛痛快快的在这个世界走一遭吧。<wbr> <br><br>
<center>四&nbsp;&nbsp;打算 <wbr></center>&nbsp;&nbsp;&nbsp;&nbsp; 打算找个人，好好的谈一场恋爱。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 妈妈的生日快到了，准备给她老人家送一份礼物。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 打算着再敲两个月题，努力的向牛看齐，不要那么菜就行。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 老姐结婚了，打算到北京去看看他们。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 打算着明年毕业实习，毕业设计，找工作。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 打算不要去打疲劳战术了，得好好的锻炼一下身体。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 打算调整好生物钟，十二点以前一定上床睡觉。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 打算着选个阳光灿烂的日子，好好的出去走走玩玩。这些天天气很好，但一直舍不得，时间很不够用。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 打算好好的敲题，好好的学习，好好的生活，好好的待生命中遇到的每一个人。 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; 现在打算着马上关电脑上床睡觉。<wbr> <br>
<img src ="http://www.cppblog.com/apple365/aggbug/68200.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-29 23:42 <a href="http://www.cppblog.com/apple365/archive/2008/11/29/68200.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1083  C++  （水题）</title><link>http://www.cppblog.com/apple365/archive/2008/11/29/68192.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Sat, 29 Nov 2008 13:33:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/29/68192.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/68192.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/29/68192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/68192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/68192.html</trackback:ping><description><![CDATA[//水题也搞了好久，郁闷 <wbr><br>//关键是在于区间累计的时候一个偶数基数的问题<wbr><br>#include&lt;iostream&gt; <wbr><br>#include&lt;algorithm&gt; <wbr><br>using namespace std; <wbr><br>int main() <wbr><br>{ int test,n,i,j; <wbr><br>&nbsp;&nbsp;int s[200],t[200],used[200]; <wbr><br>&nbsp;&nbsp;freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp;freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp;scanf("%d",&amp;test); <wbr><br>&nbsp;&nbsp;while(test--) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { scanf("%d",&amp;n); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(used,0,sizeof(used)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&amp;s[i],&amp;t[i]); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;if(s[i]&gt;t[i]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; swap(s[i],t[i]); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(s[i]%2==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]--; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]=s[i]/2; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(t[i]%2==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t[i]--; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t[i]=t[i]/2; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=s[i];j&lt;=t[i];j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[j]++;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sort(used,used+200);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",used[199]*10); <wbr><br>&nbsp;&nbsp; } <wbr><br>return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>}<wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif"></span>
<img src ="http://www.cppblog.com/apple365/aggbug/68192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-29 21:33 <a href="http://www.cppblog.com/apple365/archive/2008/11/29/68192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  3041  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/29/68163.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Sat, 29 Nov 2008 07:37:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/29/68163.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/68163.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/29/68163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/68163.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/68163.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//最近专用Ford_Fulkerson 和hungary水到手软<wbr><br>//最小割定理是一个二分图中很重要的定理－－－一个二分图中的最大匹配数等于这个图中的最小点覆盖数。<wbr><br>//最小点覆盖：假如选了一个点就相当于覆盖了以它为端点的所有边，你需要选择最少的点来覆盖所有的边 <wbr><br>#include&lt;iostream&gt; <wbr><br>using namespace std; <wbr><br>int n,m,res; <wbr><br>int l[500],r[500],map[500][500],used[500]; <wbr><br>bool path(int u) <wbr><br>{int v; <wbr><br>for(v=0;v&lt;n;v++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; if(map[u][v] &amp;&amp; !used[v]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {used[v]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(r[v]==-1 || path(r[v])) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;l[u]=v;</span> <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r[v]=u; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>} <wbr><br>void solve() <wbr><br>{ int i; <wbr><br>&nbsp;&nbsp;memset(l,-1,sizeof(l)); <wbr><br>&nbsp;&nbsp;memset(r,-1,sizeof(r)); <wbr><br>&nbsp;&nbsp;for(i=0;i&lt;n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(l[i]==-1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;memset(used,0,sizeof(used)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(path(i)) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <wbr><br><br>} <wbr><br>int main() <wbr><br>{ int i,a,b; <wbr><br>freopen("in.txt","r",stdin); <wbr><br>freopen("out.txt","w",stdout); <wbr><br>while((scanf("%d%d",&amp;n,&amp;m))!=EOF) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { memset(map,0,sizeof(map)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;m;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { scanf("%d%d",&amp;a,&amp;b); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[a-1][b-1]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res=0;&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; solve(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;res&lt;&lt;endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp; return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif">
<img src ="http://www.cppblog.com/apple365/aggbug/68163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-29 15:37 <a href="http://www.cppblog.com/apple365/archive/2008/11/29/68163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1496  C++ （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/29/68152.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Sat, 29 Nov 2008 05:08:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/29/68152.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/68152.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/29/68152.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/68152.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/68152.html</trackback:ping><description><![CDATA[<span style="COLOR: #333333">//匈牙利算法实现二分图的最大匹配，较最大流实现来的简单些 <wbr><br>//特点不需要建模，原理还是朴素最大流原理，寻找增广路径用DFS,如找到一条增广路径，沿路边取反<wbr> <br><br>#include&lt;iostream&gt; <wbr><br>using namespace std; <wbr><br>int n,m,res; <wbr><br>int l[300],r[300],map[300][300],used[300]; <wbr><br><br>bool path(int u) <wbr><br>{int v; <wbr><br>for(v=0;v&lt;m;v++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; if(map[u][v] &amp;&amp; !used[v]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {used[v]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(r[v]==-1 || path(r[v])) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;l[u]=v; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r[v]=u; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>} <wbr><br><br>void solve() <wbr><br>{ int i; <wbr><br>&nbsp;&nbsp;memset(l,-1,sizeof(l)); <wbr><br>&nbsp;&nbsp;memset(r,-1,sizeof(r)); <wbr><br>&nbsp;&nbsp;for(i=0;i&lt;n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(l[i]==-1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;memset(used,0,sizeof(used)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(path(i)) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <wbr><br><br>} <wbr><br><br>int main() <wbr><br>{ int Case,i,j,k,temp; <wbr><br>freopen("in.txt","r",stdin); <wbr><br>freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp;scanf("%d",&amp;Case); <wbr><br>&nbsp;&nbsp;while(Case--) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { memset(map,0,sizeof(map)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;n,&amp;m); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { scanf("%d",&amp;k); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;k;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {scanf("%d",&amp;temp); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[i][temp-1]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res=0;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; solve(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(res==n) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("YES\n"); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("NO\n");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp; return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br><br><br><br>什么是二分图，什么是二分图的最大匹配，这些定义我就不讲了，网上随便都找得到。二分图的最大匹配有两种求法，第一种是最大流（我在此假设读者已有网络流的知识）；第二种就是我现在要讲的匈牙利算法。这个算法说白了就是最大流的算法，但是它跟据二分图匹配这个问题的特点，把最大流算法做了简化，提高了效率。匈牙利算法其实很简单，但是网上搜不到什么说得清楚的文章。所以我决定要写一下。<br>最大流算法的核心问题就是找增广路径（augment path）。匈牙利算法也不例外，它的基本模式就是：<br><br><wbr>初始时最大匹配为空<br>while 找得到增广路径<br>&nbsp;&nbsp;&nbsp;&nbsp;do 把增广路径加入到最大匹配中去<wbr><br>可见和最大流算法是一样的。但是这里的增广路径就有它一定的特殊性，下面我来分析一下。<br>（注：匈牙利算法虽然根本上是最大流算法，但是它不需要建网络模型，所以图中不再需要源点和汇点，仅仅是一个二分图。每条边也不需要有方向。）<br><br><wbr><br>
<center><wbr><a href="http://node3.foto.ycstatic.com/200610/05/4/22270868.jpg" target=_blank><img height=104 src="http://node3.foto.ycstatic.com/200610/05/4/22270868.jpg" width=116 border=0></a><wbr>图1 <wbr><a href="http://node1.foto.ycstatic.com/200610/05/d/22290909.jpg" target=_blank><img height=104 src="http://node1.foto.ycstatic.com/200610/05/d/22290909.jpg" width=116 border=0></a><wbr>图2<wbr></center><br>图1是我给出的二分图中的一个匹配：［1，5］和［2，6］。图2就是在这个匹配的基础上找到的一条增广路径：3-&gt;6-&gt;2-&gt;5-&gt;1-&gt;4。<wbr><wbr><wbr>我们借由它来描述一下二分图中的增广路径的性质：<br><wbr><br>(1)有奇数条边。<br>(2)起点在二分图的左半边，终点在右半边。<br>(3)路径上的点一定是一个在左半边，一个在右半边，交替出现。（其实二分图的性质就决定了这一点，因为二分图同一边的点之间没有边相连，不要忘记哦。）<br>(4)整条路径上没有重复的点。<br>(5)起点和终点都是目前还没有配对的点，而其它所有点都是已经配好对的。（如图1、图2所示，［1，5］和［2，6］在图1中是两对已经配好对的点；而起点3和终点4目前还没有与其它点配对。）<br>(6)路径上的所有第奇数条边都不在原匹配中，所有第偶数条边都出现在原匹配中。（如图1、图2所示，原有的匹配是［1，5］和［2，6］，这两条配匹的边在图2给出的增广路径中分边是第2和第4条边。而增广路径的第1、3、5条边都没有出现在图1给出的匹配中。）<br>(7)最后，也是最重要的一条，把增广路径上的所有第奇数条边加入到原匹配中去，并把增广路径中的所有第偶数条边从原匹配中删除（这个操作称为增广路径的<wbr>取反<wbr>），则新的匹配数就比原匹配数增加了1个。（如图2所示，新的匹配就是所有蓝色的边，而所有红色的边则从原匹配中删除。则新的匹配数为3。）<br><wbr><wbr><br>不难想通，在最初始时，还没有任何匹配时，图1中的两条灰色的边本身也是增广路径。因此在这张二分图中寻找最大配匹的过程可能如下：<br><wbr><wbr><br>(1)找到增广路径1-&gt;5，把它取反，则匹配数增加到1。<br>(2)找到增广路径2-&gt;6，把它取反，则匹配数增加到2。<br>(3)找到增广路径3-&gt;6-&gt;2-&gt;5-&gt;1-&gt;4，把它取反，则匹配数增加到3。<br>(4)再也找不到增广路径，结束。<br><wbr><wbr><br>当然，这只是一种可能的流程。也可能有别的找增广路径的顺序，或者找到不同的增广路径，最终的匹配方案也可能不一样。但是最大匹配数一定都是相同的。<br><wbr><wbr><br>对于增广路径还可以用一个递归的方法来描述。这个描述不一定最准确，但是它揭示了寻找增广路径的一般方法：<br>&#8220;从点A出发的增广路径&#8221;一定首先连向一个在原匹配中没有与点A配对的点B。如果点B在原匹配中没有与任何点配对，则它就是这条增广路径的终点；反之，如果点B已与点C配对，那么这条增广路径就是从A到B，再从B到C，再加上&#8220;从点C出发的增广路径&#8221;。并且，这条从C出发的增广路径中不能与前半部分的增广路径有重复的点。<br><wbr><wbr><br>比如图2中，我们要寻找一条从3出发的增广路径，要做以下3步：<br>(1)首先从3出发，它能连到的点只有6，而6在图1中已经与2配对，所以目前的增广路径就是3-&gt;6-&gt;2再加上从2出发的增广路径。<br>(2)从2出发，它能连到的不与前半部分路径重复的点只有5，而且5确实在原匹配中没有与2配对。所以从2连到5。但5在图1中已经与1配对，所以目前的增广路径为3-&gt;6-&gt;2-&gt;5-&gt;1再加上从1出发的增广路径。<br>(3)从1出发，能连到的不与自已配对并且不与前半部分路径重复的点只有4。因为4在图1中没有与任何点配对，所以它就是终点。所以最终的增广路径是3-&gt;6-&gt;2-&gt;5-&gt;1-&gt;4。<br><wbr><wbr><br>但是严格地说，以上过程中从2出发的增广路径（2-&gt;5-&gt;1-&gt;4）和从1出发的增广路径（1-&gt;4）并不是真正的增广路径。因为它们不符合前面讲过的增广路径的第5条性质，它们的起点都是已经配过对的点。我们在这里称它们为&#8220;增广路径&#8221;只是为了方便说明整个搜寻的过程。而这两条路径本身只能算是两个不为外界所知的子过程的返回结果。<br>显然，从上面的例子可以看出，搜寻增广路径的方法就是DFS，可以写成一个递归函数。当然，用BFS也完全可以实现。<br><wbr><wbr><br>至此，理论基础部份讲完了。但是要完成匈牙利算法，还需要一个重要的定理：<br><wbr><wbr><br>如果从一个点A出发，没有找到增广路径，那么无论再从别的点出发找到多少增广路径来改变现在的匹配，从A出发都永远找不到增广路径。<br><br><wbr><wbr>要用文字来证明这个定理很繁，话很难说，要么我还得多画一张图，我在此就省了。其实你自己画几个图，试图举两个反例，这个定理不难想通的。（给个提示。如果你试图举个反例来说明在找到了别的增广路径并改变了现有的匹配后，从A出发就能找到增广路径。那么，在这种情况下，肯定在找到别的增广路径之前，就能从A出发找到增广路径。这就与假设矛盾了。）<br><wbr>有了这个定理，匈牙利算法就成形了。如下：<wbr><wbr><br>初始时最大匹配为空<br>for 二分图左半边的每个点i<br>&nbsp;&nbsp;&nbsp;&nbsp;do 从点i出发寻找增广路径。如果找到，则把它取反（即增加了总了匹配数）。<wbr><br><br>如果二分图的左半边一共有n个点，那么最多找n条增广路径。如果图中共有m条边，那么每找一条增广路径（DFS或BFS）时最多把所有边遍历一遍，所花时间也就是m。所以总的时间大概就是O（n * m）。<br><wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif"> 
<img src ="http://www.cppblog.com/apple365/aggbug/68152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-29 13:08 <a href="http://www.cppblog.com/apple365/archive/2008/11/29/68152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  3020  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/29/68139.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Sat, 29 Nov 2008 03:06:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/29/68139.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/68139.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/29/68139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/68139.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/68139.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//用算法导论书上最大流做的二分图匹配，所以内存耗的比较大，因为需要队列来存储增广路径<wbr> <br>//一个数组没有初始化，wrong了N次<wbr> <br>//很多人都是用匈牙利算法做的，偶也准备学学传说中的匈牙利算法<wbr> <br>#include&lt;iostream&gt; <wbr><br>using namespace std; <wbr><br>int h,w,flag,res,node; <wbr><br>int arr[500][500],map[50][20]; <wbr><br>int q</span>[10000],pre[10000],used[500]; <wbr><br>int dx[]={-1,1,0,0}; <wbr><br>int dy[]={0,0,-1,1}; <wbr><br>int path(int s)&nbsp;&nbsp;//寻找增广路径<wbr><br>{ int u,head,tail,temp,i,j; <wbr><br>&nbsp;&nbsp;head=tail=0; <wbr><br>&nbsp;&nbsp;q[tail++]=s; <wbr><br>&nbsp;&nbsp;used[s]=1; <wbr><br>&nbsp;&nbsp;while(head&lt;tail) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { temp=tail; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=head;i&lt;temp;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;u=q[i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(u==1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt;node;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(used[j]==0 &amp;&amp; arr[u][j]&gt;0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{pre[j]=u; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[j]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q[tail++]=j; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;head=temp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>} <wbr><br><br>void&nbsp;&nbsp;ford_fulkerson() //修改增光路径上边的残留容量，记录匹配的结果<br>{ int i,j,u,v,min,x,y; <wbr><br>&nbsp;&nbsp;min=INT_MAX; <wbr><br>&nbsp;&nbsp;u=pre[1]; <wbr><br>&nbsp;&nbsp;v=1; <wbr><br>&nbsp;&nbsp;while(u&gt;=0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {if(arr[u][v]&lt;min) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min=arr[u][v]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v=u; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u=pre[u]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br><br>&nbsp;&nbsp;u=pre[1]; <wbr><br>&nbsp;&nbsp;v=1; <wbr><br>&nbsp;&nbsp;while(u&gt;=0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; arr[u][v]=arr[u][v]-min; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[v][u]=arr[v][u]+min; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=u; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u=pre[u]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp; res=res+min;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>int main() <wbr><br>{int i,j,k,Case,x,y; <wbr><br>char c; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;Case); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(Case--)&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ flag=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node=2; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&amp;h,&amp;w); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(map,0,sizeof(map)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(used,0,sizeof(used)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(arr,0,sizeof(arr)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;h;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{getchar(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;w;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ scanf("%c",&amp;c); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(c=='*') <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[i][j]=node++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;h;i++) //构图建模，抽象成二分图匹配的问题<wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;j&lt;w;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ if(map[i][j] &amp;&amp; !used[map[i][j]]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;arr[0][map[i][j]]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used[map[i][j]]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k&lt;4;k++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { x=i+dx[k]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y=j+dy[k]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(x&gt;=0 &amp;&amp; x&lt;h &amp;&amp; y&gt;=0 &amp;&amp; y&lt;w &amp;&amp; map[x][y]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {arr[map[i][j]][map[x][y]]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr[map[x][y]][1]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used[map[x][y]]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(!flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { memset(used,0,sizeof(used)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(pre,-1,sizeof(pre)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(path(0)) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ford_fulkerson(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",node-2-res); <wbr><br>&nbsp;&nbsp;}&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp; return 0; <wbr><br><font style="LINE-HEIGHT: 1.3em" color=#00ff00><span style="COLOR: #000000">}</span>&nbsp;&nbsp;&nbsp;&nbsp; </font><wbr style="LINE-HEIGHT: 1.3em"><img id=paperPicArea1 style="DISPLAY: none; POSITION: relative" src="http://imgcache.qq.com/ac/b.gif">
<img src ="http://www.cppblog.com/apple365/aggbug/68139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-29 11:06 <a href="http://www.cppblog.com/apple365/archive/2008/11/29/68139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1087  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/28/68061.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Fri, 28 Nov 2008 06:06:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/28/68061.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/68061.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/28/68061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/68061.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/68061.html</trackback:ping><description><![CDATA[<p><span style="COLOR: #000000">//题目太难懂了，建模比较困难<wbr><br>//很多人把它做成二分图</span>匹配<wbr><br>//但貌似用最大流也能求出来<br>#include&lt;iostream&gt;<br>#include&lt;string&gt;<br>#include&lt;map&gt;<br>using namespace std;<br>int nr,np,na,flag,res,node;<br>int arr[402][402];<br>int q[1000],pre[1000],used[402];<br>map &lt;string,int&gt; PR;</p>
<p>int path(int s)<br>{ int u,head,tail,temp,i,j;<br>&nbsp; head=tail=0;<br>&nbsp; q[tail++]=s;<br>&nbsp; used[s]=1;<br>&nbsp; while(head&lt;tail)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { temp=tail;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=head;i&lt;temp;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; u=q[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(u==1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;node;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(used[j]==0 &amp;&amp; arr[u][j]&gt;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {pre[j]=u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[j]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q[tail++]=j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; head=temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp; return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}</p>
<p><br>void&nbsp; ford_fulkerson()<br>{ int i,j,u,v,min,x,y;<br>&nbsp; min=INT_MAX;<br>&nbsp; u=pre[1];<br>&nbsp; v=1;<br>&nbsp; while(u&gt;=0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {if(arr[u][v]&lt;min)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min=arr[u][v];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u=pre[u];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; u=pre[1];<br>&nbsp; v=1;<br>&nbsp; while(u&gt;=0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; arr[u][v]=arr[u][v]-min;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[v][u]=arr[v][u]+min;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u=pre[u];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; res=res+min;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><br>int main()<br>{int u,v,w,i,j;<br>&nbsp;char str1[25],str2[25];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freopen("in.txt","r",stdin);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freopen("out.txt","w",stdout);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;nr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node=2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;nr;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { scanf("%s",str1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!PR[str1])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PR[str1]=node++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[0][PR[str1]]++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;np); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;np;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; scanf("%s%s",str1,str2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!PR[str2])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PR[str2]=node++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[PR[str2]][1]++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;na); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;na;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; scanf("%s%s",str1,str2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!PR[str1])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PR[str1]=node++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!PR[str2])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PR[str2]=node++;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[PR[str2]][PR[str1]]=INT_MAX;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(!flag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { memset(used,0,sizeof(used));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(pre,-1,sizeof(pre)); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(path(0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ford_fulkerson();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; printf("%d\n",np-res);&nbsp;&nbsp; <br>&nbsp;&nbsp; return 0;<br>}&nbsp;&nbsp;&nbsp; <br></p>
<img src ="http://www.cppblog.com/apple365/aggbug/68061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-28 14:06 <a href="http://www.cppblog.com/apple365/archive/2008/11/28/68061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1459  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/68003.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Thu, 27 Nov 2008 09:42:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/68003.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/68003.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/68003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/68003.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/68003.html</trackback:ping><description><![CDATA[<p>一．Ford和Fulkerson迭加算法.<br><wbr><wbr><br>　　基本思路：把各条弧上单位流量的费用看成某种长度,用求解最短路问题的方法确定一条自V1至Vn的最短路;在将这条最短路作为可扩充路,用求解最大流问题的方法将其上的流量增至最大可能值;而这条最短路上的流量增加后,其上各条弧的单位流量的费用要重新确定,如此多次迭代,最终得到最小费用最大流.<br><wbr><br>　　迭加算法：<br><wbr><br>　　1) 给定目标流量F或&#8734;,给定最小费用的初始可行流=0<br><wbr><br>　　2) 若V(f)=F,停止,f为最小费用流;否则转(3).<br><wbr><br>　　3) 构造 相应的新的费用有向图W(fij),在W(fij)寻找Vs到Vt的最小费用有向路P(最短路),沿P增加流f的流量直到F,转(2);若不存在从Vs到Vt的最小费用的有向路P,停止.f就是最小费用最大流.<br><wbr><br>　　具体解题步骤：<br><wbr><br>　　设图中双线所示路径为最短路径，费用有向图为W（fij）．<br><wbr><br>　　在图(a)中给出零流 f,在图(b)中找到最小费用有向路,修改图(a)中的可行流,&#948;=min{4,3,5}=3,得图(c),再做出(c)的调整容量图,再构造相应的新的最小费用有向路得图(d), 修改图(c)中的可行流, &#948;=min{1,1,2,2}=1,得图(e),以此类推,一直得到图(h),在图(h)中以无最小费用有向路,停止,经计算:<br><wbr><br>　　图(h)中 最小费用=1*4+3*3+2*4+4*1+1*1+4*2+1*1+3*1=38<br><wbr><br>　　图(g)中 最大流=5 <br><wbr><br>　　最大流问题仅注意网络流的流通能力，没有考虑流通的费用。实际上费用因素是很重要的。例如在交通运输问题中，往往要求在完成运输任务的前提下，寻求一个使总运输费用最省的运输方案，这就是最小费用流问题。如果只考虑单位货物的运输费用，那么这个问题就变成最短路问题。由此可见，最短路问题是最小费用流问题的基础。现已有一系列求最短路的成功方法。最小费用流(或最小费用最大流)问题 ，可以交替使用求解最大流和最短路两种方法，通过迭代得到解决。<br><br><span style="COLOR: #000000"><font style="COLOR: #000000" color=#00ff00><br>//老老实实看了一天的书，终于敲出了第一个关于网络流的程序<wbr style="LINE-HEIGHT: 1.3em"><br><font style="LINE-HEIGHT: 1.3em">//庆祝流的零的突破</font></font><br></span>#include&lt;iostream&gt;<br>using namespace std;<br>int n,np,nc,m,flag,res;<br>int arr[110][110];<br>int q[10000],pre[10000],used[110];</p>
<p>int path(int s)<br>{ int u,head,tail,temp,i,j;<br>&nbsp; head=tail=0;<br>&nbsp; q[tail++]=s;<br>&nbsp; used[s]=1;<br>&nbsp; while(head&lt;tail)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { temp=tail;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=head;i&lt;temp;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp; u=q[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(u==n+1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;=n+1;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!used[j] &amp;&amp; arr[u][j]&gt;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {pre[j]=u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[j]=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q[tail++]=j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; head=temp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp; return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}</p>
<p><br>void&nbsp; ford_fulkerson()<br>{ int i,j,u,v,min;<br>&nbsp; min=INT_MAX;<br>&nbsp; <br>&nbsp; u=pre[n+1];<br>&nbsp; v=n+1;<br>&nbsp; while(u&gt;=0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {if(arr[u][v]&lt;min)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min=arr[u][v];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u=pre[u];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; u=pre[n+1];<br>&nbsp; v=n+1;<br>&nbsp; while(u&gt;=0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; arr[u][v]=arr[u][v]-min;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[v][u]=arr[v][u]+min;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; u=pre[u];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; res=res+min;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p><br>int main()<br>{int u,v,w,i,j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freopen("in.txt","r",stdin);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freopen("out.txt","w",stdout);<br>&nbsp;while((scanf("%d%d%d%d",&amp;n,&amp;np,&amp;nc,&amp;m))!=EOF)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; flag=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(arr,0,sizeof(arr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;m;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { while(getchar()!='(');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d,%d)%d",&amp;u,&amp;v,&amp;w);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[u][v]=w;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;np;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; while(getchar()!='(');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d)%d",&amp;v,&amp;w);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[n][v]=w;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;nc;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { while(getchar()!='(');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d)%d",&amp;u,&amp;w);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[u][n+1]=w;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(!flag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { memset(used,0,sizeof(used));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(pre,-1,sizeof(pre)); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(path(n))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ford_fulkerson();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; printf("%d\n",res);&nbsp;&nbsp; <br>&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; return 0;<br>}&nbsp;&nbsp;&nbsp; <br><br></p>
<img src ="http://www.cppblog.com/apple365/aggbug/68003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 17:42 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/68003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1094  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67956.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:22:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67956.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67956.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67956.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67956.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//用DFS进行拓扑排序，超时 ，只能重写<wbr> <br>#include"stdio.h"</span> <wbr><br>#include"string.h" <wbr><br>#include"stdlib.h" <wbr><br><br>int map[26][26],v[26],used[26],flag,n,total; <wbr><br>char str[27]; <wbr><br>void sort(int i,int m) <wbr><br>{ int k; <wbr><br>if(total==n) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;flag=2; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <wbr><br>for(k=0;k&lt;n &amp;&amp; !flag;k++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ if(map[i][k]==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(v[k]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ flag=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str[m]=k+65;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v[k]=1;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sort(k,m+1); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v[k]=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total--; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br><br>int main() <wbr><br>{int row,i,j,a,b,k,l; <wbr><br>char s[4]; <wbr><br>&nbsp;&nbsp; freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp; freopen("out.txt","w",stdout); <wbr><br>while(1) <wbr><br>&nbsp;&nbsp;{ scanf("%d%d",&amp;n,&amp;row); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; if(n==0 &amp;&amp; row==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp; flag=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; memset(map,0,sizeof(map)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; memset(used,0,sizeof(used)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; for(k=1;k&lt;=row;k++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { scanf("%s",s); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {memset(v,0,sizeof(v)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a=s[0]-65; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b=s[2]-65; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used[a]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used[b]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[a][b]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;n &amp;&amp; !flag;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;if(used[i]==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v[i]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[0]=i+65; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort(i,1); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v[i]=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(flag==1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Inconsistency found after %d relations.\n",k);&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(flag==2) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {printf("Sorted sequence determined after %d relations: ",k); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%c",str[i]); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(".\n"); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>&nbsp;&nbsp; if(!flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Sorted sequence cannot be determined.\n"); <wbr><br><br>&nbsp;&nbsp; } <wbr><br><br>return 0; <wbr><br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br><br><br>// 改用floyd_warshall算法才过 <wbr><br>#include"stdio.h" <wbr><br>#include"string.h" <wbr><br>#include"stdlib.h" <wbr><br>typedef struct Node{ <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int d; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char c; <wbr><br>}Node;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>int map[26][26],used[26],flag,n; <wbr><br>Node node[26]; <wbr><br><br>int cmp(const void *a, const void *b) <wbr><br>{ return (*(Node *)a).d-(*(Node *)b).d; <wbr><br>} <wbr><br><br><br>void check() <wbr><br>{int i,j; <wbr><br>for(i=0;i&lt;n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; { if(used[i]==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(map[i][j]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node[j].d++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp; qsort(node,n,sizeof(Node),cmp); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(node[i].d!=i) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=2; <wbr><br>}&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>int main() <wbr><br>{int row,i,j,a,b,k,h; <wbr><br>char s[4]; <wbr><br>&nbsp;&nbsp; freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp; freopen("out.txt","w",stdout); <wbr><br>while(1) <wbr><br>&nbsp;&nbsp;{ scanf("%d%d",&amp;n,&amp;row); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; if(n==0 &amp;&amp; row==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; flag=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; memset(map,0,sizeof(map)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; for(h=1;h&lt;=row;h++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { scanf("%s",s); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {a=s[0]-65; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b=s[2]-65; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used[a]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used[b]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;n;++i) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{node[i].d=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node[i].c=i+65; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(map[b][a]==1 || a==b) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { printf("Inconsistency found after %d relations.\n",h); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[a][b]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k&lt;26;++k) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;26;++i) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;26;++j) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[i][j]=(map[i][j]||(map[i][k]&amp;&amp;map[k][j])); <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(flag==2) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {printf("Sorted sequence determined after %d relations: ",h); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%c",node[i].c); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(".\n"); <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>&nbsp;&nbsp; if(!flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Sorted sequence cannot be determined.\n"); <wbr><br><br>&nbsp;&nbsp; } <wbr><br><br>return 0; <wbr><br>}<wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif"> 
<img src ="http://www.cppblog.com/apple365/aggbug/67956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:22 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1062 Java  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67955.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:20:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67955.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67955.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67955.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67955.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//仿照别人的思想敲得,之前不是很了解dijkstra，做过这题后有些理解 <wbr><br>//1,将当前未纳入最短路的符合要求的距离最短结点纳入最短路; <wbr><br>//2,将所有与当前纳入的结点有关联并且未被纳入最短路的结点最短距离进行更新。 <wbr><br>//图论中另一个求最小生成树的的经典算法Prim算法与Dij过程极其类似，都是贪心思想。 <wbr><br>//只是一个是对顶点的选择，另外一个是对边的选择。 <wbr><br><br>import java.util.*; <wbr><br>public class Main <wbr><br>{ public static int[][] e; <wbr><br>&nbsp;&nbsp; public static int[]&nbsp;&nbsp;dis; <wbr><br>&nbsp;&nbsp; public static int[] used; <wbr><br>&nbsp;&nbsp; public static int[] level; <wbr><br>&nbsp;&nbsp; public static int n,m; <wbr><br>&nbsp;&nbsp; public static void main(String[] args){ <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;Scanner cin = new Scanner(System.in); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;x,t; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;e = new int[101][101]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;dis = new int[101]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;used =&nbsp;&nbsp;new int[101]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;level = new int[101]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m=cin.nextInt(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n=cin.nextInt(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; e[0][i]=cin.nextInt(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; level[i]=cin.nextInt(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x=cin.nextInt(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;x;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ t=cin.nextInt(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e[t][i]=cin.nextInt(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; solve(); <wbr><br>} <wbr><br><br>public static void solve() <wbr><br>{ int max,result; <wbr><br>&nbsp;&nbsp;result=e[0][1]; <wbr><br>&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; { max=level[i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(level[j]&gt;max || level[j]&lt;max-m)//判断所交易的人的等级是否符合题目所述的条件 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[j]=1;//不符合 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[j]=0; //符合 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijkstra(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(result&gt;dis[1]) //比较每次所求的费用 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result=dis[1]; <wbr><br>} <wbr><br>System.out.println(result); <wbr><br>} <wbr><br></span>public static void dijkstra() <wbr><br>{ int min,temp,k; <wbr><br>&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp; dis[i]=e[0][i]; <wbr><br>&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; { min=0x7FFFFFFF; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=1;j&lt;=n;j++)//找出代价最小的边 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(used[j]==0 &amp;&amp; dis[j]&lt;min) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{min=dis[j]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k=j; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(k==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[k]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=1;j&lt;=n;j++)//更新其节点的值 <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(used[j]==0 &amp;&amp; e[k][j]&gt;0 &amp;&amp; min+e[k][j]&lt;dis[j]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis[j]=min+e[k][j]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp; } <wbr><br>} <wbr><br><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif"> 
<img src ="http://www.cppblog.com/apple365/aggbug/67955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:20 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1125  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67954.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:19:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67954.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67954.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67954.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//别人五分钟能敲出来的题，我却做了五个小时，差距大的吓人<wbr> <br>//一眼就可以看出来用folyd_warshell,我却用dijkstra，调试了N久<wbr> <br>//首先引进一个辅助向量d[i]表示当前所找到的从起点 v到每个终点的最短路径的长度.<wbr> <br>它的初态为:若从v到vi有狐,则d[i]为弧上的权.否则d[i]为inifity.显然有&nbsp;&nbsp; <wbr><br>//一条最短路径或者是弧(s,x),或者是中间只经过s的顶点而最后到达顶点x的路径.所以<wbr> <br>//d[x]=min{d[x],d[s]+arcs[s][x]}<wbr> <br><br>#include&lt;iostream&gt;</span> <wbr><br>using namespace std; <wbr><br>int used[101],map[101][101],d[101],n,flag,max1,max2,v; <wbr><br>void solve(int i) <wbr><br>{ int j,k,min,v0,v1; <wbr><br>&nbsp;&nbsp;for(j=1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;used[j]=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(map[i][j]==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[j]=1000000000; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[j]=map[i][j]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp; used[i]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ min=1000000000; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v0=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ if(used[j]==0 &amp;&amp; d[j]&lt;min) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {min=d[j]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v0=j; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(v0==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[v0]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=n;j++)&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {if(used[j]==0 &amp;&amp;&nbsp;&nbsp;map[v0][j] &amp;&amp; min+map[v0][j]&lt;d[j]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d[j]=min+map[v0][j]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br><br><br>&nbsp;&nbsp; max1=0; <wbr><br>&nbsp;&nbsp;for(k=1;k&lt;=n;k++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { if(k==i) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(d[k]&gt;max1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {max1=d[k]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v1=i; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;if(max1&lt;max2) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp; flag=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=v1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max2=max1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <wbr><br>}&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>int main() <wbr><br>{ int m,i,j,a,b; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp; while(cin&gt;&gt;n,n!=0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;memset(map,0,sizeof(map)); <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ cin&gt;&gt;m; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=1;j&lt;=m;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { cin&gt;&gt;a&gt;&gt;b; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[i][a]=b; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max2=1000000000; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=1;i&lt;=n;i++)&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve(i); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(n==1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;flag=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max2=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;v&lt;&lt;" "&lt;&lt;max2&lt;&lt;endl; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"disjoint"&lt;&lt;endl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><font style="LINE-HEIGHT: 1.3em" color=#00ff00><span style="COLOR: #000000">}</span>&nbsp;&nbsp;&nbsp;&nbsp; </font><wbr style="LINE-HEIGHT: 1.3em"><img id=paperPicArea1 style="DISPLAY: none; POSITION: relative" src="http://imgcache.qq.com/ac/b.gif">
<img src ="http://www.cppblog.com/apple365/aggbug/67954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:19 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  2253  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67952.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:17:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67952.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67952.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67952.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67952.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//前几天的题，别人都用floyd_warshall,我就用dijkstra;<wbr> <br>//而这个题很多人都用dijkstra,我就用floyd_warshall;<wbr> <br>//两个字，flody的代码敲起来就是简单，但效率比较的低，复杂度是(n^3)<wbr> <br><br>#include&lt;iostream&gt; <br>#include&lt;cmath&gt; <br></span>#include &lt;algorithm&gt; <br>using namespace std; <br>int main() <br>{ int n,Case,i,j,k; <br>&nbsp;&nbsp;int x[201],y[201]; <br>&nbsp;&nbsp;int map[201][201]; <br>&nbsp;&nbsp;freopen("in.txt","r",stdin); <br>&nbsp;&nbsp;freopen("out.txt","w",stdout); <br>&nbsp;&nbsp;Case=1; <br>&nbsp;&nbsp;while(scanf("%d",&amp;n),n!=0) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;memset(map,0,sizeof(map)); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=1;i&lt;=n;i++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d%d",&amp;x[i],&amp;y[i]); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( i=1;i&lt;=n;i++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( j=i+1;j&lt;=n;j++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { map[i][j]=abs((x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i])); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map[j][i]=map[i][j]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for( k=1;k&lt;=n;k++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for( i=1;i&lt;=n;i++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for( j=i+1;j&lt;=n;j++) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ if(map[i][k] &amp;&amp; map[k][j] &amp;&amp; map[i][k]&lt;map[i][j] &amp;&amp; map[k][j]&lt;map[i][j]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { if(map[i][k]&gt;map[k][j]) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[i][j]=map[i][k]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[i][j]=map[k][j]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map[j][i]=map[i][j]; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Scenario #%d\n",Case++); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Frog Distance = %.3lf\n\n",sqrt(map[1][2]*1.0)); <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; return 0;<wbr> <br>}&nbsp;&nbsp;&nbsp;&nbsp;<wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif"> 
<img src ="http://www.cppblog.com/apple365/aggbug/67952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:17 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  2240 C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67951.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:16:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67951.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67951.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67951.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67951.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67951.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//今天第二次用floyd_warshall,敲的手有点软 <wbr><br>#include&lt;iostream&gt; <wbr><br>#include&lt;string.h&gt;</span> <wbr><br>using namespace std; <wbr><br>int main() <wbr><br>{&nbsp;&nbsp;int n,m,flag,Case; <wbr><br>&nbsp;&nbsp; double temp,array[31][31]; <wbr><br>&nbsp;&nbsp; char s1[100],s2[100],str[31][100]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;Case=1; <wbr><br>&nbsp;&nbsp; while(scanf("%d",&amp;n),n!=0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;flag=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(array,0,sizeof(array)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%s",str[i]); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;m); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=m;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {int k,j; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%s%lf%s",s1,&amp;temp,s2); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int h=1;h&lt;=n;h++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ if(!strcmp(str[h],s1)) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k=h; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!strcmp(str[h],s2)) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=h;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array[k][j]=temp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int k=1;k&lt;=n;k++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for( int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int j=1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(array[i][j]&lt;array[i][k]*array[k][j]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array[i][j]= array[i][k]*array[k][j]; <wbr><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(array[i][i]&gt;1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { flag=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Case %d: Yes\n",Case++); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Case %d: No\n",Case++); <wbr><br>&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>}<wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif">
<img src ="http://www.cppblog.com/apple365/aggbug/67951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:16 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1860  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67949.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:15:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67949.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67949.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67949.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67949.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//知道了什么是bellman_ford;<wbr> <br>//一定要坚持下去<wbr> <br>#include&lt;iostream&gt; <wbr><br>#define eps 1e-8 <wbr><br>using namespace std; <wbr><br>typedef struct E{ <wbr><br>int v,u; <wbr><br>double r,c; <wbr><br>};</span> <wbr><br>int n,m,s,num; <wbr><br>double money,d[101]; <wbr><br>E e[201]; <wbr><br>bool&nbsp;&nbsp;bellman() <wbr><br>{ int flag; <wbr><br>&nbsp;&nbsp;memset(d,0,sizeof(d)); <wbr><br>&nbsp;&nbsp;d[s]=money; <wbr><br>&nbsp;&nbsp;while(d[s]&lt;=money+eps) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ flag=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;num;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(d[e[i].v]+eps&lt;(d[e[i].u]-e[i].c) * e[i].r) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ d[e[i].v]=(d[e[i].u]-e[i].c)*e[i].r; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!flag) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return d[s]&gt;money+eps; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>} <wbr><br><br>int main() <wbr><br>{int V,U; <wbr><br>double cv,rv,cu,ru; <wbr><br>&nbsp;&nbsp; freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp; freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp;while((scanf("%d%d%d%lf",&amp;n,&amp;m,&amp;s,&amp;money))!=EOF) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; {num=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=m;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{scanf("%d%d%lf%lf%lf%lf",&amp;U,&amp;V,&amp;rv,&amp;cv,&amp;ru,&amp;cu); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e[num].v=V; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e[num].u=U; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e[num].r=rv; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e[num++].c=cv; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e[num].v=U; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e[num].u=V; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e[num].r=ru; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e[num++].c=cu; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(bellman()) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("YES\n"); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("NO\n"); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0; <wbr><br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif"> 
<img src ="http://www.cppblog.com/apple365/aggbug/67949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:15 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1789  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67947.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:13:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67947.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67947.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67947.html</trackback:ping><description><![CDATA[//题目意思难懂 <wbr><br>//其实就是求最小生成树，用经典的prim算法 <wbr><br>#include&lt;iostream&gt; <wbr><br>using namespace std; <wbr><br>int&nbsp;&nbsp;array[2001][2001],total; <wbr><br>int&nbsp;&nbsp;used[2001],dis[2001]; <wbr><br>char truck[2001][8]; <wbr><br>void prim(int n) <wbr><br>{ int v,min; <wbr><br>&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{used[i]=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis[i]=array[1][i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[1]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(true) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;min=INT_MAX; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!used[i] &amp;&amp; dis[i]&lt;min) //在S的补集选出权最小的边<wbr> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { min=dis[i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=i; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(v==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total=total+min; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[v]=1; //加入S集合<wbr> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j =1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!used[j] &amp;&amp; dis[j]&gt;array[v][j]) //更新最小权边的值<wbr> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis[j]=array[v][j]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>int main() <wbr><br>{int n,sum; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freopen("out.txt","w",stdout); <wbr><br>while(scanf("%d",&amp;n),n!=0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%s",truck[i]); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(array,0,sizeof(array)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { if(i==j || array[i][j]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum=0;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int k=0;k&lt;7;k++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(truck[i][k]!=truck[j][k]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array[i][j]=sum; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; array[j][i]=sum; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prim(n); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("The highest possible quality is 1/%d.\n",total); <wbr><br><br>&nbsp;&nbsp;}&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;return 0; <wbr><br>}<span style="COLOR: #000000">&nbsp;</span>&nbsp;&nbsp;&nbsp; <wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif">
<img src ="http://www.cppblog.com/apple365/aggbug/67947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:13 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1258  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67946.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:11:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67946.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67946.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67946.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67946.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">/<wbr>/汗，模板真的很爽 <wbr><br>//只是稍稍改了一下前一题的代码，最小生成树问题<wbr> <br>#include&lt;iostream&gt; <wbr><br>using namespace std; <wbr><br>int&nbsp;&nbsp;array[101][101],total; <wbr><br>int&nbsp;&nbsp;used[101],dis[101]; <wbr><br>void prim(int n) <wbr><br>{ int v,min; <wbr><br>&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{used[i]=0;</span> <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis[i]=array[1][i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[1]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(true) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;min=INT_MAX; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!used[i] &amp;&amp; dis[i]&lt;min) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { min=dis[i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=i; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(v==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total=total+min; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[v]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j =1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!used[j] &amp;&amp; dis[j]&gt;array[v][j]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis[j]=array[v][j]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>int main() <wbr><br>{int n,sum; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freopen("out.txt","w",stdout); <wbr><br>while((scanf("%d",&amp;n))!=EOF) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;array[i][j]); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prim(n); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",total); <wbr><br>}&nbsp;&nbsp; <wbr><br><br>&nbsp;&nbsp;return 0; <wbr><br>}&nbsp;&nbsp;&nbsp;&nbsp; <wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif">
<img src ="http://www.cppblog.com/apple365/aggbug/67946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:11 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  2485  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67945.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:09:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67945.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67945.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67945.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67945.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//faint ,太汗了，今天上午用prim水到手软<wbr> <br>#include&lt;iostream&gt; <wbr><br>using namespace std; <wbr><br>int&nbsp;&nbsp;array[501][501],total; <wbr><br>int&nbsp;&nbsp;used[501],dis[501]; <wbr><br>void prim(int n)</span> <wbr><br>{ int v,min; <wbr><br>&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{used[i]=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dis[i]=array[1][i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[1]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(true) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;min=INT_MAX; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!used[i] &amp;&amp; dis[i]&lt;min) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { min=dis[i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v=i; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(v==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(min&gt;total) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total=min; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used[v]=1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j =1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!used[j] &amp;&amp; dis[j]&gt;array[v][j]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis[j]=array[v][j]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>int main() <wbr><br>{int m,n,sum; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scanf("%d",&amp;m); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; while(m--) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ scanf("%d",&amp;n); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=1;j&lt;=n;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;array[i][j]); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prim(n); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d\n",total); <wbr><br>}&nbsp;&nbsp; <wbr><br><br>&nbsp;&nbsp;return 0; <wbr><br>} <wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif"> 
<img src ="http://www.cppblog.com/apple365/aggbug/67945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:09 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  3295  C++  （图论）</title><link>http://www.cppblog.com/apple365/archive/2008/11/27/67943.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Wed, 26 Nov 2008 16:07:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/27/67943.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67943.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/27/67943.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67943.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67943.html</trackback:ping><description><![CDATA[<p>#include&lt;iostream&gt;<br>using namespace std;<br>typedef&nbsp; struct Node<br>{ int u,v,t;<br>}Node; <br>Node e[25000];<br>int n,m,w,en;<br>bool bellmanford()<br>{ bool flag; <br>&nbsp; int dis[1001];<br>&nbsp; for(int i=0;i&lt;n-1;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { flag=false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;en;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(dis[e[j].v]&gt;dis[e[j].u]+e[j].t)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {dis[e[j].v]=dis[e[j].u]+e[j].t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!flag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;en;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( dis[e[i].v]&gt;dis[e[i].u]+e[i].t)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; return false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>int main()<br>{int Case ,u,v,t;<br>&nbsp;freopen("in.txt","r",stdin);<br>&nbsp;freopen("out.txt","w",stdout);<br>&nbsp;scanf("%d",&amp;Case);<br>&nbsp;while(Case--)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { scanf("%d%d%d",&amp;n,&amp;m,&amp;w);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=m;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; scanf("%d%d%d",&amp;u,&amp;v,&amp;t);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e[en].u=u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e[en].v=v;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e[en++].t=t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e[en].u=v;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e[en].v=u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e[en++].t=t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=w;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; scanf("%d%d%d",&amp;u,&amp;v,&amp;t);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e[en].u=u;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e[en].v=v;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e[en++].t=-t;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(bellmanford())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; puts("YES");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; puts("NO");<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp; return 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>}&nbsp;&nbsp;&nbsp; <br><br></p>
<div class=tit>Bellman-Ford 算法及其优化</div>
<p>
<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt id=blog_text>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 22pt"><font face="Times New Roman">Bellman-Ford </font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 22pt">算法及其优化</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 22pt"></span></strong></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"></font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"></font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法与另一个非常著名的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Dijkstra</font></span><span style="FONT-SIZE: 12pt">算法一样，用于求解单源点最短路径问题。</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-ford</font></span><span style="FONT-SIZE: 12pt">算法除了可求解边权均非负的问题外，还可以解决存在负权边的问题（意义是什么，好好思考），而</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Dijkstra</font></span><span style="FONT-SIZE: 12pt">算法只能处理边权非负的问题，因此</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法的适用面要广泛一些。但是，原始的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法时间复杂度为</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> O</font></span><span style="FONT-SIZE: 12pt">（</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">VE</font></span><span style="FONT-SIZE: 12pt">）</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">,</font></span><span style="FONT-SIZE: 12pt">比</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Dijkstra</font></span><span style="FONT-SIZE: 12pt">算法的时间复杂度高，所以常常被众多的大学算法教科书所忽略，就连经典的《算法导论》也只介绍了基本的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法，在国内常见的基本信息学奥赛教材中也均未提及，因此该算法的知名度与被掌握度都不如</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Dijkstra</font></span><span style="FONT-SIZE: 12pt">算法。事实上，有多种形式的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法的优化实现。这些优化实现在时间效率上得到相当提升，例如近一两年被热捧的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA</font></span><span style="FONT-SIZE: 12pt">（</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Shortest-Path Faster Algoithm<span style="mso-spacerun: yes"> </span></font></span><span style="FONT-SIZE: 12pt">更快的最短路径算法）算法的时间效率甚至由于</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Dijkstra</font></span><span style="FONT-SIZE: 12pt">算法，因此成为信息学奥赛选手经常讨论的话题。然而，限于资料匮乏，有关</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法的诸多问题常常困扰奥赛选手。如：该算法值得掌握么？怎样用编程语言具体实现？有哪些优化？与</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA</font></span><span style="FONT-SIZE: 12pt">算法有关系么？本文试图对</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法做一个比较全面的介绍。给出几种实现程序，从理论和实测两方面分析他们的时间复杂度，供大家在备战省选和后续的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">noi</font></span><span style="FONT-SIZE: 12pt">时参考。</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"></font></span></p>
            <h2 style="MARGIN: 13pt 0cm"><span style="FONT-SIZE: 12pt">Bellman-Ford</span><span style="FONT-SIZE: 12pt">算法思想</span><span style="FONT-SIZE: 12pt"></span></h2>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法能在更普遍的情况下（存在负权边）解决单源点最短路径问题。对于给定的带权（有向或无向）图</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> G=</font></span><span style="FONT-SIZE: 12pt">（</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">V,E</font></span><span style="FONT-SIZE: 12pt">），其源点为</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">s</font></span><span style="FONT-SIZE: 12pt">，加权函数</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> w</font></span><span style="FONT-SIZE: 12pt">是</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 12pt">边集</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> E </font></span><span style="FONT-SIZE: 12pt">的映射。对图</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">G</font></span><span style="FONT-SIZE: 12pt">运行</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法的结果是一个布尔值，<strong style="mso-bidi-font-weight: normal">表明图中是否存在着一个从源点</strong></span><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">s</font></span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 12pt">可达的负权回路。</span></strong><span style="FONT-SIZE: 12pt">若不存在这样的回路，算法将给出从源点</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">s</font></span><span style="FONT-SIZE: 12pt">到</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 12pt">图</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">G</font></span><span style="FONT-SIZE: 12pt">的任意顶点</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">v</font></span><span style="FONT-SIZE: 12pt">的最短路径</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">d[v]</font></span><span style="FONT-SIZE: 12pt">。</span><span style="FONT-SIZE: 12pt"></span></p>
            <h3 style="MARGIN: 13pt 0cm"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法流程分为三个阶段：</span><span style="FONT-SIZE: 12pt"></span></h3>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36pt; mso-list: l0 level1 lfo2"><span style="FONT-SIZE: 12pt">（1）<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt">初始化：将除源点外的所有顶点的最短距离估计值</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> d[v]</font></span><span style="FONT-SIZE: 12pt"> &#8592;+&#8734;, d[s] &#8592;0;</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36pt; mso-list: l0 level1 lfo2"><span style="FONT-SIZE: 12pt">（2）<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt">迭代求解：反复对边集<span>E中的每条边进行松弛操作，使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离；（运行|v|-1次）</span></span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36pt; mso-list: l0 level1 lfo2"><span style="FONT-SIZE: 12pt">（3）<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt">检验负权回路：判断边集</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">E</font></span><span style="FONT-SIZE: 12pt">中的每一条边的两个端点是否收敛。如果存在未收敛的顶点，则算法返回</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">false</font></span><span style="FONT-SIZE: 12pt">，表明问题无解；否则算法返回</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">true</font></span><span style="FONT-SIZE: 12pt">，并且从源点可达的顶点</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">v</font></span><span style="FONT-SIZE: 12pt">的最短距离保存在</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> d[v]</font></span><span style="FONT-SIZE: 12pt">中。</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"></font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"></font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"></font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt">算法描述如下：</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes"></span>Bellman-Ford(G,w,s) </font></span><span style="FONT-SIZE: 12pt">：</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">boolean<span style="mso-spacerun: yes">&nbsp;&nbsp; </span>//</font></span><span style="FONT-SIZE: 12pt">图</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">G<span style="mso-spacerun: yes"> </span></font></span><span style="FONT-SIZE: 12pt">，边集</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 12pt">函数</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> w<span style="mso-spacerun: yes"> </span></font></span><span style="FONT-SIZE: 12pt">，</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">s</font></span><span style="FONT-SIZE: 12pt">为源点</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><font face="Times New Roman"><span style="FONT-SIZE: 12pt">1<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt">for<span style="mso-spacerun: yes"> </span>each<span style="mso-spacerun: yes"> </span>vertex<span style="mso-spacerun: yes"> </span>v</span></font><span style="FONT-SIZE: 12pt"> &#8712; V（G） do<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//初始化<span style="mso-spacerun: yes"> </span>1阶段</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">2<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">d[v]</font></span><span style="FONT-SIZE: 12pt"> &#8592;+&#8734;</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">3<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt">d[s] &#8592;0;<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//1阶段结束</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">4<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt">for<span style="mso-spacerun: yes"> </span>i=1<span style="mso-spacerun: yes"> </span>to<span style="mso-spacerun: yes"> </span>|v|-1<span style="mso-spacerun: yes"> </span>do<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//2阶段开始，双重循环。</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">5<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span>for<span style="mso-spacerun: yes"> </span>each edge（u,v） &#8712;E(G) do //边集数组要用到，穷举每条边。</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">6<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>If d[v]&gt;<span style="mso-spacerun: yes"> </span>d[u]+<span style="mso-spacerun: yes"> </span>w(u,v)<span style="mso-spacerun: yes"> </span>then<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//松弛判断</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">7<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>d[v]=d[u]+w(u,v)<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>//松弛操作<span style="mso-spacerun: yes">&nbsp;&nbsp; </span>2阶段结束</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">8<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt">for<span style="mso-spacerun: yes"> </span>each edge（u,v） &#8712;E(G) do</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">9<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;</span>If d[v]&gt;<span style="mso-spacerun: yes"> </span>d[u]+<span style="mso-spacerun: yes"> </span>w(u,v)<span style="mso-spacerun: yes"> </span>then</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">10<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>Exit<span style="mso-spacerun: yes"> </span>false</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; mso-list: l2 level1 lfo3"><font face="Times New Roman"><span style="FONT-SIZE: 12pt">11<span style="FONT: 7pt Times New Roman">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt">Exit true</span></font></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"></font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt">&nbsp;下面给出描述性证明：</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="FONT-SIZE: 12pt">首先指出，图的任意一条最短路径既不能包含负权回路，也不会包含正权回路，因此它最多包含</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">|v|-1</font></span><span style="FONT-SIZE: 12pt">条边。</span><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="FONT-SIZE: 12pt">其次，从源点</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">s</font></span><span style="FONT-SIZE: 12pt">可达的所有顶点如果</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 12pt">存在最短路径，则这些最短路径构成一个以</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">s</font></span><span style="FONT-SIZE: 12pt">为根的最短路径树。</span><span style="FONT-SIZE: 12pt">Bellman-Ford算法的迭代松弛操作，实际上就是按顶点距离s的层次，逐层生成这棵最短路径树的过程。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt">在对每条边进行<span>1遍松弛的时候，生成了从s出发，层次至多为1的那些树枝。也就是说，找到了与s至多有1条边相联的那些顶点的最短路径；对每条边进行第2遍松弛的时候，生成了第2层次的树枝，就是说找到了经过2条边相连的那些顶点的最短路径&#8230;&#8230;。因为最短路径最多只包含|v|-1 条边，所以，只需要循环|v|-1 次。</span></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt">每实施一次松弛操作，最短路径树上就会有一层顶点达到其最短距离，此后这层顶点的最短距离值就会一直保持不变，不再受后续松弛操作的影响。（但是，每次还要判断松弛，这里浪费了大量的时间，怎么优化？单纯的优化是否可行？）<span></span></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt">如果没有负权回路，由于最短路径树的高度最多只能是<span>|v|-1，所以最多经过|v|-1遍松弛操作后，所有从s可达的顶点必将求出最短距离。如果 d[v]仍保持 +&#8734;，则表明从s到v不可达。</span></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt">如果有负权回路，那么第<span><span style="mso-spacerun: yes"> </span>|v|-1 遍松弛操作仍然会成功，这时，负权回路上的顶点不会收敛。</span></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt"></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt">例如对于上图，边上方框中的数字代表权值，顶点<span>A,B,C之间存在负权回路。S是源点，顶点中数字表示运行Bellman-Ford算法后各点的最短距离估计值。</span></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-SIZE: 12pt">此时<span>d[a]的值为1，大于d[c]+w(c,a)的值-2，由此d[a]可以松弛为-2，然后d[b]又可以松弛为-5,d[c]又可以松弛为-7.下一个周期，d[a]又可以更新为更小的值，这个过程永远不会终止。因此，在迭代求解最短路径阶段结束后，可以通过检验边集E的每条边(u,v)是否满足关系式<span style="mso-spacerun: yes"> </span>d[v]&gt;<span style="mso-spacerun: yes"> </span>d[u]+<span style="mso-spacerun: yes"> </span>w(u,v)<span style="mso-spacerun: yes"> </span>来判断是否存在负权回路。<br><br>&nbsp;&nbsp; </p>
            <h2 style="MARGIN: 13pt 0cm"><span style="FONT-SIZE: 12pt; mso-ascii-: 16.0pt">二、基本</span><span style="FONT-SIZE: 12pt; mso-bidi-font-size: 16.0pt"> Bellman-Ford </span><span style="FONT-SIZE: 12pt; mso-ascii-: 16.0pt">算法的</span><span style="FONT-SIZE: 12pt; mso-bidi-font-size: 16.0pt"> pascal</span><span style="FONT-SIZE: 12pt; mso-ascii-: 16.0pt">实现。</span></h2>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="FONT-SIZE: 12pt">见</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> bellmanford.pas<span style="mso-spacerun: yes"> </span></font></span><span style="FONT-SIZE: 12pt">文件。</span></p>
            <h2 style="MARGIN: 13pt 0cm"><span style="FONT-SIZE: 12pt; mso-ascii-: 16.0pt">三、基本算法之上的优化。</span></h2>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt">分析</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法，不难看出，外层循环（迭代次数）</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">|v|-1</font></span><span style="FONT-SIZE: 12pt">实际上取得是上限。由上面对算法正确性的证明可知，需要的迭代遍数等于最短路径树的高度。如果不存在负权回路，平均情况下的最短路径树的高度应该远远小于</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> |v|-1</font></span><span style="FONT-SIZE: 12pt">，在此情况下，多余最短路径树高的迭代遍数就是时间上的浪费，由此，可以依次来实施优化。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt">从细节上分析，如果在某一遍迭代中，算法描述中第</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">7</font></span><span style="FONT-SIZE: 12pt">行的松弛操作未执行，说明该遍迭代所有的边都没有被松弛。可以证明（怎么证明？）：至此后，边集中所有的边都不需要再被松弛，从而可以提前结束迭代过程。这样，优化的措施就非常简单了。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt">设定一个布尔型标志变量</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes"> </span>relaxed</font></span><span style="FONT-SIZE: 12pt">，初值为</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">false</font></span><span style="FONT-SIZE: 12pt">。在内层循环中，仅当有边被成功松弛时，将</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> relaxed </font></span><span style="FONT-SIZE: 12pt">设置为</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">true</font></span><span style="FONT-SIZE: 12pt">。如果没有边被松弛，则提前结束外层循环。这一改进可以极大的减少外层循环的迭代次数。优化后的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> <span>bellman-ford</span></font></span><span style="FONT-SIZE: 12pt">函数如下。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">function bellmanford(s:longint):boolean;</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>begin</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for i:=1 to nv do</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>d[i]:=max;</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>d[s]:=0;</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for i:=1 to nv-1 do</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>begin</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #ff6600">relaxed:=false; </span></font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>for j:=1 TO ne do</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if(d[edges[j].s]&lt;&gt;max) and<span style="mso-spacerun: yes"> </span>(d[edges[j].e]&gt;d[edges[j].s]+edges[j].w)</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>then<span style="mso-spacerun: yes"> </span>begin</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 162.85pt; mso-char-indent-count: 13.57; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">d[edges[j].e]:=d[edges[j].s]+edges[j].w ;</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 162.85pt; mso-char-indent-count: 13.57; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt; COLOR: #ff6600"><font face="Times New Roman">relaxed:=true;</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>end;</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #ff6600"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span>if not relaxed then break;</span></font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 78pt; mso-char-indent-count: 6.5; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">end; </font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;</span>for i:=1 to ne do</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if d[edges[j].e]&gt;d[edges[j].s]+edges[j].w then exit(false);</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>exit(true);</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>end;</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt">这样看似平凡的优化，会有怎样的效果呢？有研究表明，对于随机生成数据的平均情况，时间复杂度的估算公式为</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">1.13|E|<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if |E|&lt;|V|</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">0.95*|E|*lg|V|<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if |E|&gt;|V| </font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt">优化后的算法在处理有负权回路的测试数据时，由于每次都会有边被松弛，所以</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">relaxed</font></span><span style="FONT-SIZE: 12pt">每次都会被置为</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">true</font></span><span style="FONT-SIZE: 12pt">，因而不可能提前终止外层循环。这对应了最坏情况，其时间复杂度仍旧为</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">O(VE)</font></span><span style="FONT-SIZE: 12pt">。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt"><span style="FONT-SIZE: 12pt">优化后的算法的时间复杂度已经和用二叉堆优化的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Dijkstra</font></span><span style="FONT-SIZE: 12pt">算法相近了，而编码的复杂程度远比后者低。加之</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法能处理各种边值权情况下的最短路径问题，因而还是非常优秀的。</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Usaco3.2.6 </font></span><span style="FONT-SIZE: 12pt">的程序见</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">bellmanford_1.pas</font></span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt">四、</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA </font></span><span style="FONT-SIZE: 12pt">算法</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>SPFA</font></span><span style="FONT-SIZE: 12pt">是目前相当优秀的求最短路径的算法，值得我们掌握。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>SPFA</font></span><span style="FONT-SIZE: 12pt">对</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法优化的关键之处在于意识到：<span style="COLOR: #ff6600">只有那些在前一遍松弛中改变了距离估计值的点，才可能引起他们的邻接点的距离估计值的改变。</span>因此，用一个先进先出的队列来存放被成功松弛的顶点。初始时，源点</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">s</font></span><span style="FONT-SIZE: 12pt">入队。当队列不为空时，取出对首顶点，对它的邻接点进行松弛。如果某个邻接点松弛成功，且该邻接点不在队列中，则将其入队。经过有限次的松弛操作后，队列将为空，算法结束。</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA</font></span><span style="FONT-SIZE: 12pt">算法的实现，需要用到一个先进先出的队列</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> queue </font></span><span style="FONT-SIZE: 12pt">和一个指示顶点是否在队列中的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> </font></span><span style="FONT-SIZE: 12pt">标记数组</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> mark</font></span><span style="FONT-SIZE: 12pt">。为了方便查找某个顶点的邻接点，图采用临界表存储。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="FONT-SIZE: 12pt">程序存储在</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> spfa.pas</font></span><span style="FONT-SIZE: 12pt">中。以</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">usaco 3.2.6 </font></span><span style="FONT-SIZE: 12pt">试题</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">2</font></span><span style="FONT-SIZE: 12pt">为例。用邻接表写的程序。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 12pt"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp;&nbsp; </font></span></span><span style="FONT-SIZE: 12pt">需要注意的是：仅当图不存在负权回路时，</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA</font></span><span style="FONT-SIZE: 12pt">能正常工作。如果图存在负权回路，由于负权回路上的顶点无法收敛，总有顶点在入队和出队往返，队列无法为空，这种情况下</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA</font></span><span style="FONT-SIZE: 12pt">无法正常结束。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt; mso-char-indent-count: 2.5; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt">判断负权回路的</span><span style="FONT-SIZE: 12pt">方案很多，世间流传最广的是记录每个结点进队次数，超过</span><span style="FONT-SIZE: 12pt">|V|</span><span style="FONT-SIZE: 12pt">次表示有负权</span><span style="FONT-SIZE: 12pt"><br><br></span><span style="FONT-SIZE: 12pt">还有一种方法为记录这个结点在路径中处于的位置，</span><span style="FONT-SIZE: 12pt">ord[i]</span><span style="FONT-SIZE: 12pt">，每次更新的时候</span><span style="FONT-SIZE: 12pt">ord[i]=ord[x]+1</span><span style="FONT-SIZE: 12pt">，若超过</span><span style="FONT-SIZE: 12pt">|V|</span><span style="FONT-SIZE: 12pt">则表示有负圈</span><span style="FONT-SIZE: 12pt">.....<br><br></span><span style="FONT-SIZE: 12pt">其他方法还有很多，我反倒觉得流传最广的方法是最慢的</span><span style="FONT-SIZE: 12pt">.......</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt; mso-char-indent-count: 2.5; mso-char-indent-size: 12.0pt"></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt; mso-char-indent-count: 2.5; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt">关于</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA</font></span><span style="FONT-SIZE: 12pt">的时间复杂度，不好准确估计，一般认为是</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> O</font></span><span style="FONT-SIZE: 12pt">（</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">kE</font></span><span style="FONT-SIZE: 12pt">），</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">k</font></span><span style="FONT-SIZE: 12pt">是常数</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt; mso-char-indent-count: 2.5; mso-char-indent-size: 12.0pt"></p>
            <h2 style="MARGIN: 13pt 0cm"></h2>
            <h2 style="MARGIN: 13pt 0cm"><span style="FONT-SIZE: 12pt; mso-ascii-: 16.0pt">五、时间效率实测</span></h2>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt; mso-char-indent-count: 2.5; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt">上述介绍的</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法及两种的优化，只是在理论上分析了时间复杂度，用实际的数据测试，会有什么结果呢？为此，我们选择</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman"> usaco 3.2.6</font></span><span style="FONT-SIZE: 12pt">。</span></p>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt; mso-char-indent-count: 2.5; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Spfa</font></span><span style="FONT-SIZE: 12pt">的时间效率还是很高的。并且</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">spfa</font></span><span style="FONT-SIZE: 12pt">的编程复杂度要比</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Dijksta+heap</font></span><span style="FONT-SIZE: 12pt">优化要好的多。</span></p>
            <h2 style="MARGIN: 13pt 0cm"><span style="FONT-SIZE: 12pt; mso-ascii-: 16.0pt">六、结论</span></h2>
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 30pt; mso-char-indent-count: 2.5; mso-char-indent-size: 12.0pt"><span style="FONT-SIZE: 12pt">经过优化</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Bellman-Ford</font></span><span style="FONT-SIZE: 12pt">算法是非常优化的求单源最短路径的算法，</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA</font></span><span style="FONT-SIZE: 12pt">时间效率要优于第一种优化形式，但第一种优化形式的编码复杂度低于</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA</font></span><span style="FONT-SIZE: 12pt">。两种优化形式的编程复杂度都低于</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">Dijkstra</font></span><span style="FONT-SIZE: 12pt">算法。如果在判断是否存在负权回路，推荐使用第一种优化形式，否则推荐使用</span><span style="FONT-SIZE: 12pt"><font face="Times New Roman">SPFA</font></span><span style="FONT-SIZE: 12pt">。</span></p>
            </span></span></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.cppblog.com/apple365/aggbug/67943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-27 00:07 <a href="http://www.cppblog.com/apple365/archive/2008/11/27/67943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1961  C++  （KMP）</title><link>http://www.cppblog.com/apple365/archive/2008/11/26/67863.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Tue, 25 Nov 2008 17:13:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/26/67863.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67863.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/26/67863.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67863.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67863.html</trackback:ping><description><![CDATA[#include&lt;iostream&gt; <wbr><br>using namespace std; <wbr><br>int n,next[1000008]; <wbr><br>char s[1000008]; <wbr><br>void Get_next() <wbr><br>{int j,k; <wbr><br>j=1; <wbr><br>k=0; <wbr><br>next[1]=0; <wbr><br>while(j&lt;=n+1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { if(k==0 || s[j]==s[k]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ j++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next[j]=k; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=next[k]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>} <wbr><br>int main() <wbr><br>{ int i,cnt,k; <wbr><br>&nbsp;&nbsp; freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp; freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp; k=1; <wbr><br>&nbsp;&nbsp;while(scanf("%d\n",&amp;n),n!=0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { for(i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]=getchar(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s[i]='#'; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get_next(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Test case #%d\n",k++); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=2;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i%(i+1-next[i+1])==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ cnt=i/(i+1-next[i+1]); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cnt!=1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d %d\n",i,cnt); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp; return 0; <wbr><br>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>该题的题意是这样的，给若干个字符串，判断该字符串的前n位最多重复了几次，比如，给ababab，结果是前4位重复了2次，前6位重复了3次，忽略重复一次的情况.现在我们将注意力放在一个给定的字符串重复了多少次，然后做一个循环就可以求出所有的结果。<wbr><wbr><br>我们要根据kmp算法中的next函数来解决这个问题，以ababab为例加以说明：<wbr><wbr><br>String：ababab<wbr><wbr><br>Next： 0112345<wbr><wbr><br>这里根据后面的需要多计算了一位next值。<wbr><wbr><br>我们用ababab即作为主串有作为模式串来进行匹配，假设匹配到第7为时不匹配了(下标中1开始)，要根据next[7](=5)的值继续匹配：<wbr><wbr><br>ababab*<wbr><br>ababab&amp;<wbr><br>ababab*<wbr><br>ababab<wbr><br>这样，我们用（length+1）-next[length+1]就是字符串向右移动的位数，在该例中为7-5=2.然后用总的长度除以这个向右移动的位数，如果能除尽的话，结果就是重复的次数，否则重复的次数为1<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<img src ="http://www.cppblog.com/apple365/aggbug/67863.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-26 01:13 <a href="http://www.cppblog.com/apple365/archive/2008/11/26/67863.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  2752  C++  （KMP）</title><link>http://www.cppblog.com/apple365/archive/2008/11/26/67862.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Tue, 25 Nov 2008 17:08:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/26/67862.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67862.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/26/67862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67862.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67862.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">#include&lt;iostream&gt; <wbr><br>#include&lt;string&gt; <wbr><br>using namespace std; <wbr><br>int n,next[400008],result[400008];; <wbr><br>char s[400008],t[400008]; <wbr><br>void Get_next() <wbr><br>{int j,k; <wbr><br>j=1; <wbr><br>k=0; <wbr><br>next[1]=0; <wbr><br>while(j&lt;=n+1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { if(k==0 || s[j]==s[k]) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ j++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k++; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next[j]=k; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=next[k]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br>} <wbr><br>int main() <wbr><br>{ int i,k; <wbr><br>&nbsp;&nbsp; freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp; freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp; while(scanf("%s",t)!=EOF) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {n=strlen(t); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=1;i&lt;=n;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s[i]=t[i-1]; <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s[i]='#'; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get_next(); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; k=0; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result[k++]=n+1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i=n+1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(i!=1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ if(next[i]!=1) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result[k++]=next[i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=next[i]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=k-1;i&gt;0;i--) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d ",result[i]-1); <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",result[i]-1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br><br>&nbsp;&nbsp; return 0; <wbr><br>}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<img src ="http://www.cppblog.com/apple365/aggbug/67862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-26 01:08 <a href="http://www.cppblog.com/apple365/archive/2008/11/26/67862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJ  1694  C++ （排序）</title><link>http://www.cppblog.com/apple365/archive/2008/11/26/67860.html</link><dc:creator>蜗牛</dc:creator><author>蜗牛</author><pubDate>Tue, 25 Nov 2008 17:01:00 GMT</pubDate><guid>http://www.cppblog.com/apple365/archive/2008/11/26/67860.html</guid><wfw:comment>http://www.cppblog.com/apple365/comments/67860.html</wfw:comment><comments>http://www.cppblog.com/apple365/archive/2008/11/26/67860.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/apple365/comments/commentRss/67860.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/apple365/services/trackbacks/67860.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">//不会敲，是偶看过别人的结题报告后敲的，学习下<wbr><br>#include&lt;iostream&gt; <wbr><br>#include&lt;algorithm&gt; <wbr><br>using namespace std; <wbr><br>typedef struct Node <wbr><br>{ int label; <wbr><br>&nbsp;&nbsp; int cnt; <wbr><br>&nbsp;&nbsp; int leaf[200]; <wbr><br>}; <wbr><br>Node tree[200]; <wbr><br>int solve(int i) <wbr><br>{&nbsp;&nbsp; int&nbsp;&nbsp;stone[200],result,temp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;if(tree[i].cnt==0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0;j&lt;tree[i].cnt;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stone[j]=solve(tree[i].leaf[j]); <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp; sort(stone,stone+tree[i].cnt); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; result=stone[tree[i].cnt-1]; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; temp=result-1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp; for(int k=tree[i].cnt-2;k&gt;=0;k--) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ if(temp-stone[k]&gt;=0) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp--; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {result=result+stone[k]-temp; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=stone[k]-1; <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <wbr><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result; <wbr><br>} <wbr><br>int main() <wbr><br>{ int n,m; <wbr><br>&nbsp;&nbsp;freopen("in.txt","r",stdin); <wbr><br>&nbsp;&nbsp;freopen("out.txt","w",stdout); <wbr><br>&nbsp;&nbsp;scanf("%d",&amp;n); <wbr><br>&nbsp;&nbsp;while(n--) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { scanf("%d",&amp;m); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=1;i&lt;=m;i++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;scanf("%d%d",&amp;tree[i].label,&amp;tree[i].cnt); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int j=0;j&lt;tree[i].cnt;j++) <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;tree[i].leaf[j]); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",solve(1)); <wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><br><br>&nbsp;&nbsp; return 0; <wbr><br>}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <wbr><img id=paperPicArea1 src="http://imgcache.qq.com/ac/b.gif"> 
<img src ="http://www.cppblog.com/apple365/aggbug/67860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/apple365/" target="_blank">蜗牛</a> 2008-11-26 01:01 <a href="http://www.cppblog.com/apple365/archive/2008/11/26/67860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>