﻿<?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++博客-Smile-文章分类-模板</title><link>http://www.cppblog.com/Smile3/category/17322.html</link><description>Smile</description><language>zh-cn</language><lastBuildDate>Thu, 17 Nov 2011 14:40:57 GMT</lastBuildDate><pubDate>Thu, 17 Nov 2011 14:40:57 GMT</pubDate><ttl>60</ttl><item><title>hunnu 10982 优先队列的使用</title><link>http://www.cppblog.com/Smile3/articles/154459.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Fri, 26 Aug 2011 16:48:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/154459.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/154459.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/154459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/154459.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/154459.html</trackback:ping><description><![CDATA[<div>这个现场没有写的原因是优先队列不太熟练，并且情况比较多，这里wa了一次是因为初始化错了，逻辑思路还是比较清晰的。<br /><br />#include &lt;cstdio&gt;<br />#include &lt;cstring&gt;<br />#include &lt;queue&gt;<br />#include &lt;vector&gt;<br />using namespace std;<br /><br />int const max_n = 1010;<br />struct node{//buy 从大到小 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int price;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; friend bool operator &lt; ( node n1, node n2 ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( n1.price &lt; n2.price )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( n1.price == n2.price )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( n1.num &gt; n2.num )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node(int a,int b ):price(a),num(b){}<br />};<br />struct node1{//sell 从小到大 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int price;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; friend bool operator &lt; ( node1 n1, node1 n2 ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( n1.price &gt; n2.price )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( n1.price == n2.price )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( n1.num &gt; n2.num )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node1(int a,int b ):price(a),num(b){}<br />};<br />int main(){//ask:high need bid：sell low ldprice：目前成交价格 <br />&nbsp;&nbsp;&nbsp; int t;<br />&nbsp;&nbsp;&nbsp; scanf("%d",&amp;t);<br />&nbsp;&nbsp;&nbsp; while( t-- ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char a[1000],b[1000],c[1000];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int dprice,dnum;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ldprice = 0,ask=0,bid=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; priority_queue&lt; node,vector&lt;node&gt; &gt; buy;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; priority_queue&lt; node1,vector&lt;node1&gt; &gt; sell;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while( n-- ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ldprice = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ask = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bid = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%s %d %s %s %d",a,&amp;dnum,&amp;b,&amp;c,&amp;dprice);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( strcmp(a,"buy") == 0 ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !sell.empty() )<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; if( dprice &lt; (sell.top()).price ){<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; buy.push(node(dprice,dnum));<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; ask = (buy.top()).price;<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; bid = (sell.top()).price;<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; }<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; 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; node1 s1(0,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while( !sell.empty() &amp;&amp; dnum &gt; 0 &amp;&amp; (sell.top()).price &lt;=dprice ){<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; s1 = sell.top();<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; sell.pop();<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; if( s1.num&lt;=dnum ){<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; dnum -= s1.num;<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; s1.num = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; 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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s1.num -= dnum;<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; dnum = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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; ldprice = s1.price;<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; }<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( dnum &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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buy.push(node(dprice,dnum));<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( s1.num &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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sell.push(s1);<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( !buy.empty() )<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; ask = (buy.top()).price;<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; 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;&nbsp;&nbsp; ask = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !sell.empty() )<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; bid = (sell.top()).price;<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; 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;&nbsp;&nbsp; bid = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ldprice = dprice;&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;&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; 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; buy.push(node(dprice,dnum));<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; ask = (buy.top()).price;<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; bid = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&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; if( buy.empty() ){<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; sell.push(node1(dprice,dnum));<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; ask = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bid = (sell.top()).price;<br />&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; 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; if( dprice &gt; (buy.top()).price ){<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; sell.push(node1(dprice,dnum));<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; ask = (buy.top()).price;<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; bid = (sell.top()).price;<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; }<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; 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;&nbsp;&nbsp;&nbsp; node b1(0,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while( !buy.empty() &amp;&amp; dnum &gt; 0 &amp;&amp; dprice &lt;= (buy.top()).price){<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; b1 = buy.top();<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; buy.pop();<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; if( b1.num&lt;=dnum ){<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;&nbsp;&nbsp; dnum -= b1.num;<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;&nbsp;&nbsp; b1.num = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b1.num -= dnum;<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;&nbsp;&nbsp;&nbsp;&nbsp; dnum = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ldprice = b1.price;<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; }<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( dnum &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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sell.push(node1(dprice,dnum));<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( b1.num &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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buy.push(b1);<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( !buy.empty() )<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; ask = (buy.top()).price;<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; 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;&nbsp;&nbsp; ask = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !sell.empty() )<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; bid = (sell.top()).price;<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; 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;&nbsp;&nbsp; bid = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldprice = dprice;<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; }<br />&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;&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;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( bid == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("- ");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d ",bid);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( ask == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("- ",ask);<br />&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; printf("%d ",ask);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( ldprice == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("-\n");<br />&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; printf("%d\n",ldprice);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}<br /></div><img src ="http://www.cppblog.com/Smile3/aggbug/154459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-08-27 00:48 <a href="http://www.cppblog.com/Smile3/articles/154459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最小费用最大流 </title><link>http://www.cppblog.com/Smile3/articles/153029.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Thu, 11 Aug 2011 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/153029.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/153029.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/153029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/153029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/153029.html</trackback:ping><description><![CDATA[<div>#include &lt;cstdio&gt;<br />#include &lt;algorithm&gt;<br />#include &lt;cstring&gt;<br />#include &lt;queue&gt;<br />#include &lt;cmath&gt;<br />using namespace std;<br /><br />int const max_n = 25;<br />double const INF = 1.7976931348623158e+308;<br /><br />int x,y,n;<br />double a[max_n/2][2];<br />double ans;<br />int cap[2*max_n][2*max_n];<br />double cost[2*max_n][2*max_n];<br />int flow[2*max_n][2*max_n];<br /><br />double dis( double&nbsp; x1,double y1,double x2,double y2 ){<br />&nbsp;&nbsp;&nbsp; double temp = ( sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) ) + sqrt( (x1-x)*(x1-x) + (y1-y)*(y1-y) ));<br />&nbsp;&nbsp;&nbsp; //printf("%.2lf %.2lf %.2lf %.2lf %.2lf\n",x1,y1,x2,y2,temp);<br />&nbsp;&nbsp;&nbsp; return temp;<br />}<br /><br />void init(){<br />&nbsp;&nbsp; &nbsp;scanf("%d%d",&amp;x,&amp;y);<br />&nbsp;&nbsp; &nbsp;scanf("%d",&amp;n);<br />&nbsp;&nbsp; &nbsp;for( int i=0; i&lt;2*n; i++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;scanf("%lf%lf",&amp;a[i][0],&amp;a[i][1]);<br />&nbsp;&nbsp;&nbsp; memset(cap,0,sizeof(cap));<br />&nbsp;&nbsp;&nbsp; for( int i=0; i&lt;2*max_n; i++ )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;2*max_n; j++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;cost[i][j] = 0.0;<br />&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;= 4*n; i++ ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;cap[0][i] = 1;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;cap[i][4*n+1] = 1;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp; &nbsp;for( int i=1; i&lt;=4*n ; i++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int j=i+1; j&lt;=4*n; j++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( i != j )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;cap[i][j] = 1;<br />&nbsp;&nbsp;&nbsp; for( int i=0; i&lt;2*n; i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=i+1;&nbsp; j&lt;2*n; j++)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( i != j ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cost[i+1][j+1] = min ( dis(a[i][0],a[i][1],a[j][0],a[j][1]),dis( a[j][0],a[j][1],a[i][0],a[i][1]) );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cost[j+1][i+1] = - cost[i+1][j+1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cap[0][i+1] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cap[i+1][j+1] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cap[j+1][2*n+1] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cost[2*n+i+1][2*n+j+1] = cost[i+1][j+1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cost[2*n+j+1][2*n+i+1] = - cost[2*n+i+1][2*n+j+1];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp;&nbsp; for( int i=0; i&lt;=2*n+1; i++ ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;=2*n+1; j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2lf ",cost[i][j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; for( int i=0; i&lt;=2*n+1; i++ ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;=2*n+1; j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d ",cap[i][j]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br />void minflow(){<br />&nbsp;&nbsp; &nbsp;queue&lt;int&gt; q;<br />&nbsp;&nbsp; &nbsp;double d[2*max_n];<br />&nbsp;&nbsp; &nbsp;memset(flow,0,sizeof(flow));<br />&nbsp;&nbsp; &nbsp;ans = 0.0;<br />&nbsp;&nbsp; &nbsp;int max_f = 0;<br />&nbsp;&nbsp; &nbsp;int s = 0;<br />&nbsp;&nbsp; &nbsp;int t = 4*n + 1;<br />&nbsp;&nbsp; &nbsp;int id = 0;<br />&nbsp;&nbsp; &nbsp;for( ; ; ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//bellman_ford_begin<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;bool inq[2*max_n];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int pa[2*max_n];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i=0; i&lt;=t; i++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pa[i] = i;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i=0; i&lt;=t; i++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;d[i]&nbsp; = (i==s?0:INF);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;memset(inq,0,sizeof(inq));<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q.push(s);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while( !q.empty() ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int u = q.front();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q.pop();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;inq[u] = false;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int v=0; v&lt;=t; v++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( cap[u][v] &gt; flow[u][v] &amp;&amp; d[v]&gt;d[u]+cost[u][v] ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;d[v] = d[u] + cost[u][v];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pa[v] = u;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( !inq[v] ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;inq[v] = true;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;q.push(v);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // bellman_ford_end<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( d[t] == INF )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("d[t] = %.2lf\n",d[t]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //t不可达，表示当前流为所求<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int a = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*for( int u=t; u!=s; u = pa[u] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( a&lt; cap[pa[u]][v] = -flow[pa[u]][v] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a =&nbsp; cap[pa[u]][v] = -flow[pa[u]][v];*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //计算可改进量<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int u=t; u!=s; u=pa[u] ){//增广<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; printf("u = %d\n",u);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;flow[pa[u]][u] = +a;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;flow[u][pa[u]] -= a;//flow =&nbsp; -flow<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ans += d[t];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("ans = %.2lf\n",ans);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;max_f++;<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;printf("max_f = %d\n",max_f);<br />}<br /><br />int main(){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int t;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while( ~scanf("%d",&amp;t) ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int id = 0;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while( t-- ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minflow();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Case #%d: %.2lf\n",++id,ans/2);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br /><br />}<br /></div><img src ="http://www.cppblog.com/Smile3/aggbug/153029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-08-11 10:36 <a href="http://www.cppblog.com/Smile3/articles/153029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>树状数组 japan</title><link>http://www.cppblog.com/Smile3/articles/152893.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Tue, 09 Aug 2011 13:50:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/152893.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/152893.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/152893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/152893.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/152893.html</trackback:ping><description><![CDATA[<div>#include &lt;cstdio&gt;<br />#include &lt;cstring&gt;<br />#include &lt;algorithm&gt;<br /><br />using namespace std;<br /><br />int const max_n = 1010;<br /><br />typedef struct node{<br />&nbsp;&nbsp;&nbsp; int x;<br />&nbsp;&nbsp;&nbsp; int y;<br />}node;<br /><br />node a[max_n*max_n];<br />int num[max_n];<br />int b[max_n*max_n];<br />__int64 ans;<br />int t,n,m,k,max_y;<br /><br />bool cmp(node na,node nb){<br />&nbsp;&nbsp;&nbsp; if(na.x&lt;nb.x)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp; if( na.x == nb.x )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( na.y&lt;nb.y)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp; return false;<br />}<br /><br />int lowbit( int t){//设t的末尾有k个0，返回值为2的k次方<br />&nbsp;&nbsp;&nbsp; return&nbsp; t &amp; (t^(t-1));<br />}<br /><br />void modify(int pos,int add){//修改操作<br />&nbsp;&nbsp;&nbsp; while ( pos &lt;= max_y) {//变量范围为1至最大的值<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;num[pos] += add;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;pos += lowbit(pos);<br />&nbsp;&nbsp; &nbsp;}<br />}<br /><br />int getsum(int end)<br />{<br />&nbsp;&nbsp; &nbsp;int sum=0;<br />&nbsp;&nbsp; &nbsp;while (end&gt;0) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sum+=num[end];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;end-=lowbit(end);<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;return sum;<br />}<br /><br />int main(){<br />&nbsp;&nbsp;&nbsp; while( ~scanf("%d",&amp;t) ){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int id = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(t--){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;scanf("%d%d%d",&amp;n,&amp;m,&amp;k);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;max_y = -1;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i=0; i&lt;k; i++ ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;scanf("%d%d",&amp;a[i].x,&amp;a[i].y);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( max_y &lt; a[i].y )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;max_y = a[i].y;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sort(a,a+k,cmp);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i=0; i&lt;k; i++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;b[i+1] = a[i].y;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ans = 0;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;memset(num,0,sizeof(num));<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i=1; i&lt;=k; i++ ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;modify(b[i],1);//将b[i]之后的加1操作，表示比它小<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ans += i - getsum(b[i]);//getsum得到是比b[i]小的个数。<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("Test case %d: %I64d\n",++id,ans);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp;&nbsp; return 0;<br />}<br /></div><img src ="http://www.cppblog.com/Smile3/aggbug/152893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-08-09 21:50 <a href="http://www.cppblog.com/Smile3/articles/152893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>归并排序 求逆序数 hunnu Japan 10888</title><link>http://www.cppblog.com/Smile3/articles/152820.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Mon, 08 Aug 2011 14:36:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/152820.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/152820.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/152820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/152820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/152820.html</trackback:ping><description><![CDATA[<div>这个题目是逆序数的变形，主要我存在的问题是思维的问题，先按x从小到大排序，如果x相等，再按y从小到大排序，我觉得我应该能想到怎么做，但是主要原因是我没有积极去思考，我发现每次我都是这样，有很强的依赖感和懒惰感，其实好多题目按照常规思路去想，加一点优化，或者利用现有的知识其实我是能够解决的，比如说比赛的时候我就过分依赖队友，我觉得这样不仅会让自己的水平得不到提高，更重要的是自己会丧失队友对我的信任，其实我是能够做出来的，比如说上次的动归，那还算有点难度，但是我还是想出来，现场也不是很多人想出来了，我下次会选择一个题目，然后仔细的思考，争取做出来，先想暴力的思路是什么，再优化，如果我连暴力都不敢暴力的话，我想我们怎么能够想出更复杂的算法去解决这个问题，所以我想对自己说的是，一要相信自己，不要去依赖别人，而是要积极思考，哪怕是最难的题目，也可以先用最暴力的方法解，但是如果不尝试的话，我想这是根本就不可能解出来的，所以一定要开动脑筋想，先想暴力，再想优化。<br /><br />#include &lt;cstdio&gt;<br />#include &lt;algorithm&gt;<br /><br />using namespace std;<br />typedef struct node{<br />&nbsp;&nbsp; &nbsp;int x;<br />&nbsp;&nbsp; &nbsp;int y;<br />}node;<br />__int64 ans;<br />int const max_n = 1000010;<br />node a[max_n];<br />int b[max_n];<br />int c[max_n];<br />int n,m,k;<br /><br />bool cmp(node na,node nb){<br />&nbsp;&nbsp; &nbsp;if( na.x &lt; nb.x)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return true;<br />&nbsp;&nbsp; &nbsp;if( na.x &gt; nb.x )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return false;<br />&nbsp;&nbsp; &nbsp;if( na.y &lt; nb.y)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return true;<br />&nbsp;&nbsp; &nbsp;return false;<br />}<br /><br />void merge_sort(int *A,int x,int y,int *T){//A数组x&#8212;&#8212;y的左闭又开区间的归并算法<br />&nbsp;&nbsp; &nbsp;if( y-x &gt;1 ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//printf("%I64d\n",ans);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int m = x +(y-x)/2;//此处不用（x+y）/2避免越界<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int p = x,q=m,i=x;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;merge_sort(A,x,m,T);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;merge_sort(A,m,y,T);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while( p&lt;m || q&lt;y ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( q&gt;=y || ( p&lt;m &amp;&amp; A[p]&lt;=A[q]))<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;T[i++] = A[p++];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else{<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;T[i++] = A[q++];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ans +=&nbsp; m-p;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( i=x; i&lt;y; i++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;A[i] = T[i];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//printf("x = %d y = %d ans = %I64d\n",x,y,ans);<br />&nbsp;&nbsp; &nbsp;}<br />}<br /><br />int main(){<br />&nbsp;&nbsp; &nbsp;int t;<br />&nbsp;&nbsp; &nbsp;while( 1 == scanf("%d",&amp;t) ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int id = 0;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;while( t-- ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;scanf("%d%d%d",&amp;n,&amp;m,&amp;k);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i=0; i&lt;k; i++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;scanf("%d%d",&amp;a[i].x,&amp;a[i].y);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sort(a,a+k,cmp);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;ans = 0;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( int i=0; i&lt;k; i++ )<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;b[i+1] = a[i].y;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;b[k+1] = 10000;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;merge_sort(b,1,k+1,c);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;printf("Test case %d: %I64d\n",++id,ans);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;return 0;<br />}<br /></div><img src ="http://www.cppblog.com/Smile3/aggbug/152820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-08-08 22:36 <a href="http://www.cppblog.com/Smile3/articles/152820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近公共祖先LCA Tarjan算法</title><link>http://www.cppblog.com/Smile3/articles/151720.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Sat, 23 Jul 2011 13:20:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151720.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151720.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151720.html</trackback:ping><description><![CDATA[<span style="color: #008000;">//</span>parent为并查集，FIND为并查集的查找操作<span style="color: #008000;"><br />//</span>QUERY为询问结点对集合<span style="color: #008000;"><br />//</span><span style="color: #008000;">TREE为基图有根树</span><br /><br />Tarjan(u)<span style="color: #000000;"><br />&nbsp;visit[u] </span><span style="color: #000000;">=</span> <span style="color: #0000ff;">true</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> each (u, v) </span><span style="color: #0000ff;">in</span> QUERY<span style="color: #000000;"><br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #0000ff;">if</span> visit[v]<span style="color: #000000;"><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ans(u, v) </span><span style="color: #000000;">=</span> FIND(v)<span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> each (u, v) </span><span style="color: #0000ff;">in</span> TREE    <span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span> <span style="color: #000000;">!</span>visit[v]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tarjan(v)<span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent[v]</span><span style="color: #000000;">=u</span><span style="color: #000000;"></span>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br /><div><pre><span style="color: #000000;">#include </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">iostream</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include </span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />#include </span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;"> NN 40002 </span><span style="color: #008000;">//</span><span style="color: #008000;"> number of house</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">#define</span><span style="color: #000000;"> MM 202   </span><span style="color: #008000;">//</span><span style="color: #008000;"> number of query</span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span><span style="color: #000000;"> std;<br /><br />typedef </span><span style="color: #0000ff;">struct</span><span style="color: #000000;"> node{<br />    </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> v;<br />    </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> d;<br />    </span><span style="color: #0000ff;">struct</span><span style="color: #000000;"> node </span><span style="color: #000000;">*</span><span style="color: #000000;">nxt;<br />}NODE;<br /><br />NODE </span><span style="color: #000000;">*</span><span style="color: #000000;">Link1[NN];<br />NODE edg1[NN </span><span style="color: #000000;">*</span> <span style="color: #800080;">2</span><span style="color: #000000;">]; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 树中的边</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br />NODE </span><span style="color: #000000;">*</span><span style="color: #000000;">Link2[NN];<br />NODE edg2[NN </span><span style="color: #000000;">*</span> <span style="color: #800080;">2</span><span style="color: #000000;">]; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 询问的点对</span><span style="color: #008000;"><br /></span><span style="color: #000000;"><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> idx1, idx2, N, M;<br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> res[MM][</span><span style="color: #800080;">3</span><span style="color: #000000;">]; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 记录结果，res[i][0]: u   res[i][1]: v  res[i][2]: lca(u, v)</span><span style="color: #008000;"><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> fat[NN];<br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> vis[NN];<br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> dis[NN];<br /><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Add(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> u, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> v, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> d, NODE edg[], NODE </span><span style="color: #000000;">*</span><span style="color: #000000;">Link[], </span><span style="color: #0000ff;">int</span> <span style="color: #000000;">&amp;</span><span style="color: #000000;">idx){<br />    edg[idx].v </span><span style="color: #000000;">=</span><span style="color: #000000;"> v;<br />    edg[idx].d </span><span style="color: #000000;">=</span><span style="color: #000000;"> d;<br />    edg[idx].nxt </span><span style="color: #000000;">=</span><span style="color: #000000;"> Link[u];<br />    Link[u] </span><span style="color: #000000;">=</span><span style="color: #000000;"> edg </span><span style="color: #000000;">+</span><span style="color: #000000;"> idx</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br /><br />    edg[idx].v </span><span style="color: #000000;">=</span><span style="color: #000000;"> u;<br />    edg[idx].d </span><span style="color: #000000;">=</span><span style="color: #000000;"> d;<br />    edg[idx].nxt </span><span style="color: #000000;">=</span><span style="color: #000000;"> Link[v];<br />    Link[v] </span><span style="color: #000000;">=</span><span style="color: #000000;"> edg </span><span style="color: #000000;">+</span><span style="color: #000000;"> idx</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br />}<br /><br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> find(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> x){ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 并查集路径压缩</span><span style="color: #008000;"><br /></span> <span style="color: #0000ff;">if</span><span style="color: #000000;">(x </span><span style="color: #000000;">!=</span><span style="color: #000000;"> fat[x]){<br />        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> fat[x] </span><span style="color: #000000;">=</span><span style="color: #000000;"> find(fat[x]);<br />    }<br />    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> x;<br />}<br /><br /></span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Tarjan(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> u){<br />    vis[u] </span><span style="color: #000000;">=</span> <span style="color: #800080;">1</span><span style="color: #000000;">;<br />    fat[u] </span><span style="color: #000000;">=</span><span style="color: #000000;"> u;<br /><br />    </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (NODE </span><span style="color: #000000;">*</span><span style="color: #000000;">p </span><span style="color: #000000;">=</span><span style="color: #000000;"> Link2[u]; p; p </span><span style="color: #000000;">=</span><span style="color: #000000;"> p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nxt){<br />        </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(vis[p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">v]){<br />            res[p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">d][</span><span style="color: #800080;">2</span><span style="color: #000000;">] </span><span style="color: #000000;">=</span><span style="color: #000000;"> find(p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">v); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 存的是最近公共祖先结点</span><span style="color: #008000;"><br /></span><span style="color: #000000;">        }<br />    }<br /><br />    </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (NODE </span><span style="color: #000000;">*</span><span style="color: #000000;">p </span><span style="color: #000000;">=</span><span style="color: #000000;"> Link1[u]; p; p </span><span style="color: #000000;">=</span><span style="color: #000000;"> p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">nxt){<br />        </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">vis[p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">v]){<br />            dis[p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">v] </span><span style="color: #000000;">=</span><span style="color: #000000;"> dis[u] </span><span style="color: #000000;">+</span><span style="color: #000000;"> p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">d;<br />            Tarjan(p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">v);<br />            fat[p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">v] </span><span style="color: #000000;">=</span><span style="color: #000000;"> u;<br />        }<br />    }<br />}<br /></span><span style="color: #0000ff;">int</span><span style="color: #000000;"> main() {<br />    </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> T, i, u, v, d;<br />    scanf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">T);<br />    </span><span style="color: #0000ff;">while</span><span style="color: #000000;">(T</span><span style="color: #000000;">--</span><span style="color: #000000;">){<br />        scanf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d%d</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">N, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">M);<br /><br />        idx1 </span><span style="color: #000000;">=</span> <span style="color: #800080;">0</span><span style="color: #000000;">;<br />        memset(Link1, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(Link1));<br />        </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (i </span><span style="color: #000000;">=</span> <span style="color: #800080;">1</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;</span><span style="color: #000000;"> N; i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />            scanf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d%d%d</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">u, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">d);<br />            Add(u, v, d, edg1, Link1, idx1);<br />        }<br /><br />        idx2 </span><span style="color: #000000;">=</span> <span style="color: #800080;">0</span><span style="color: #000000;">;<br />        memset(Link2, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(Link2));<br />        </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (i </span><span style="color: #000000;">=</span> <span style="color: #800080;">1</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;=</span><span style="color: #000000;"> M; i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />            scanf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d%d</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">u, </span><span style="color: #000000;">&amp;</span><span style="color: #000000;">v);<br />            Add(u, v, i, edg2, Link2, idx2);<br />            res[i][</span><span style="color: #800080;">0</span><span style="color: #000000;">] </span><span style="color: #000000;">=</span><span style="color: #000000;"> u;<br />            res[i][</span><span style="color: #800080;">1</span><span style="color: #000000;">] </span><span style="color: #000000;">=</span><span style="color: #000000;"> v;<br />        }<br /><br />        memset(vis, </span><span style="color: #800080;">0</span><span style="color: #000000;">, </span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(vis));<br />        dis[</span><span style="color: #800080;">1</span><span style="color: #000000;">] </span><span style="color: #000000;">=</span> <span style="color: #800080;">0</span><span style="color: #000000;">;<br />        Tarjan(</span><span style="color: #800080;">1</span><span style="color: #000000;">);<br /><br />        </span><span style="color: #0000ff;">for</span><span style="color: #000000;"> (i </span><span style="color: #000000;">=</span> <span style="color: #800080;">1</span><span style="color: #000000;">; i </span><span style="color: #000000;">&lt;=</span><span style="color: #000000;"> M; i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br />            printf(</span><span style="color: #800000;">"</span><span style="color: #800000;">%d\n</span><span style="color: #800000;">"</span><span style="color: #000000;">, dis[res[i][</span><span style="color: #800080;">0</span><span style="color: #000000;">]] </span><span style="color: #000000;">+</span><span style="color: #000000;"> dis[res[i][</span><span style="color: #800080;">1</span><span style="color: #000000;">]] </span><span style="color: #000000;">-</span> <span style="color: #800080;">2</span> <span style="color: #000000;">*</span><span style="color: #000000;"> dis[res[i][</span><span style="color: #800080;">2</span><span style="color: #000000;">]]);<br />        }<br />    }<br />    </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">;<br />}</span></pre></div><img src ="http://www.cppblog.com/Smile3/aggbug/151720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-23 21:20 <a href="http://www.cppblog.com/Smile3/articles/151720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BIT 第三场 The King’s Problem</title><link>http://www.cppblog.com/Smile3/articles/151498.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Wed, 20 Jul 2011 10:47:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151498.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151498.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151498.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151498.html</trackback:ping><description><![CDATA[<div>知识点：强连通分量、缩点、再加用最大二分匹配求最小路径覆盖。<br />bug处：突然发现没有模板自己敲的时候巨多的错误，比如说求强连通分量时连反向表都没有建，再比如说求二分匹配的时候在一个图里表示两个图的时候应是flag标记数组写不好，注意是在if(0== flag[b[i][j]])之后写flag[b[i][j]] = 1;因为此时是j点在交错路上面。最后是没有想清楚那个最小路径覆盖的数目应该是缩点之后的有向无环图的点的个数，即强连通分量的个数减去最大匹配数。<br />思维：觉得还是知识点懂得太少了，并且现场有点怕，不敢去啃这个题目，我觉得比较好的策略是我们把简单题目做完之后就选定一道题目，啃，我觉得自己这方面没有做好，随着我们知识系统的完善，我觉得我们应该每一次都努力的啃一道难题出来。<br /><br />#include&lt;iostream&gt;<br />#include&lt;cstdio&gt;<br />#include&lt;cstring&gt;<br />#include&lt;vector&gt;<br /><br />using namespace std;<br /><br />#define max 5010<br />int n,m;<br />vector&lt;int&gt; a[max],b[max],adjact[max];<br />int flag[5010];<br />int id[max];<br />int result[max];<br />int pipe[max];<br /><br />void initone()//初始化注意建反向图<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(a,0,sizeof(a));<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(adjact,0,sizeof(adjact));<br />&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;n,&amp;m);<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=m; i++ )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int aa,bb;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;aa,&amp;bb);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[aa].push_back(bb);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adjact[bb].push_back(aa);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />}<br /><br />void vistone(int i,int &amp;sig)//第一次深度优先搜索，注意其中的id为改点的最后离开时间，所以id的赋值应该要放到递归的后面，注意sig的&amp;符号<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = a[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[a[i][j]] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(a[i][j],sig);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; id[++sig] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp; return;<br />}<br /><br />void visttwo(int i,int sig)//注意此时用到的图为反向之后的图<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; result[i] = sig;<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = adjact[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[adjact[i][j]] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(adjact[i][j],sig);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return;<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />int f()//用来求强连通分量，首先对原图dfs一次，记住每个点的离开时间，然后按离开时间从大到小再对反向图dfs一次，注意第二次的sig要自增。<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(id,0,sizeof(id));<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp;&nbsp; int sig = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=n; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[i] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(i,sig);<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; sig = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=n; i&gt;=1; --i )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[ id[i] ] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(id[i],++sig);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return sig;<br />}<br /><br />void inittwo( )//建缩点之后的图，注意此时建成之后的图中的点应该是强连通分量。所以注意建图过程中的赋值。<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(b,0,sizeof(b));<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=n; i++ )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num = a[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( result[i] != result[a[i][j]] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[result[i]].push_back(result[a[i][j]]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return;<br />}<br /><br />bool find(int i)//注意find函数中的flag赋值处，pipe数组的赋值，只要单向赋值。<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = b[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == flag[b[i][j]] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag[b[i][j]] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 0 == pipe[b[i][j]] || find( pipe[b[i][j]] ) )<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pipe[b[i][j]] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&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; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; false;<br />}<br />&nbsp;<br />int hungary(int ss)//注意每一次调用find之前都要将flag数组中的元素赋为0.<br />{<br />&nbsp;&nbsp;&nbsp; int sum = 0;<br />&nbsp;&nbsp;&nbsp; memset(pipe,0,sizeof(pipe));<br />&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=ss; i++ )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( find(i) )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return sum;<br />}&nbsp;&nbsp; &nbsp;<br /><br />int main()<br />{<br />&nbsp;&nbsp; int t;<br />&nbsp;&nbsp; scanf("%d",&amp;t);<br />&nbsp;&nbsp; while( t-- )<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initone();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int ss = f();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inittwo();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nn = hungary(ss);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",ss-nn);<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp; return 0;<br />}</div><img src ="http://www.cppblog.com/Smile3/aggbug/151498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-20 18:47 <a href="http://www.cppblog.com/Smile3/articles/151498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hnu第一场  Cat vs. Dog《最大二分匹配 匈牙利算法》</title><link>http://www.cppblog.com/Smile3/articles/151294.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Mon, 18 Jul 2011 04:06:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151294.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151294.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151294.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151294.html</trackback:ping><description><![CDATA[<div>重点：在于建图，建好图之后就一个纯裸的二分匹配。<br />知识：匈牙利算法 注意 最大独立集是集合的总元素个数减去最大二分匹配数<br />bug：此题无bug处，数据如果要符合实际情况，无法出特殊数据，要卡只能卡时间。<br /><br />#include&lt;cstdio&gt;//此次建图是建的二分图，上面一篇文章是用的一个图求二分匹配。<br />#include&lt;cstring&gt;<br />#include&lt;vector&gt;<br />using namespace std;<br /><br />#define max 510<br />int ch1[max][2];<br />int ch2[max][2];<br />int flag[max];<br />int vy[max];<br />int vx[max];<br />vector&lt;int&gt; p1[max];<br />int num1,num2;<br />int p,m,n;<br /><br />void init()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; char a,b;<br />&nbsp;&nbsp;&nbsp;&nbsp; int d,c;<br />&nbsp;&nbsp;&nbsp;&nbsp; memset(p1,0,sizeof(p1));<br />&nbsp;&nbsp;&nbsp;&nbsp; num1 = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp; num2 = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d%d",&amp;m,&amp;n,&amp;p);<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=p; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getchar();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%c%d %c%d",&amp;a,&amp;c,&amp;b,&amp;d);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( 'C' == a )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch1[++num1][0] = c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch1[num1][1] = d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch2[++num2][0] = c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch2[num2][1] = d;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=num1; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=1; j&lt;=num2; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( ch1[i][0] == ch2[j][1] || ch1[i][1] == ch2[j][0] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p1[i].push_back(j);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br />} <br /><br />bool find(int i)//注意flag数组的赋值<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = p1[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;num; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ p1[i][j] ] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag[ p1[i][j] ] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( vy[ p1[i][j] ] == 0 || find( vy[ p1[i][j] ] ) )<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vx[i] = p1[i][j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vy[ p1[i][j] ] = i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&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; }<br />&nbsp;&nbsp; return&nbsp; false;<br />}<br /><br />int main()<br />{<br />&nbsp;&nbsp;&nbsp; int t;<br />&nbsp;&nbsp;&nbsp; scanf("%d",&amp;t);<br />&nbsp;&nbsp;&nbsp; while( t-- )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sig = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(vx,0,sizeof(vx));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(vy,0,sizeof(vy));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=num1; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( find(i) )<br />&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; sig ++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",p-sig);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}</div><img src ="http://www.cppblog.com/Smile3/aggbug/151294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-18 12:06 <a href="http://www.cppblog.com/Smile3/articles/151294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最大二分匹配  邻接矩阵实现</title><link>http://www.cppblog.com/Smile3/articles/151097.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Fri, 15 Jul 2011 13:11:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151097.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151097.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151097.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151097.html</trackback:ping><description><![CDATA[<div><div>第1行3个整数,V1,V2的节点数目n1,n2,G的边数m <br />第2-m+1行，每行两个整数t1,t2,代表V1中编号为t1的点和V2中编号为t2的点之间有边相连 　　<br />输出格式: 　　1个整数ans,代表最大匹配数<br /></div>#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br />int n1, n2, m, ans;<br />int result[101]; //记录V2中的点匹配的点的编号<br />bool state [101]; //记录V2中的每个点是否被搜索过<br />bool data[101][101];//邻接矩阵 true代表有边相连<br /><br />void init()<br />{<br />&nbsp;&nbsp;&nbsp; int t1, t2;<br />&nbsp;&nbsp;&nbsp; memset(data, 0, sizeof(data));<br />&nbsp;&nbsp;&nbsp; memset(result, 0, sizeof(result));<br />&nbsp;&nbsp;&nbsp; ans = 0;<br />&nbsp;&nbsp;&nbsp; scanf("%d%d%d", &amp;n1, &amp;n2, &amp;m);<br />&nbsp;&nbsp;&nbsp; for (int i = 1; i &lt;= m; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d", &amp;t1, &amp;t2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data[t1][t2] = true;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return;<br />}<br /><br />bool find(int a)<br />{<br />&nbsp;&nbsp;&nbsp; for (int i = 1; i &lt;= n2; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( data[a][i] == 1 &amp;&amp; !state[i] ) //如果节点i与a相邻并且未被查找过<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state[i] = true; //标记i为已查找过<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( result[i] == 0 //如果i未在前一个匹配M中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || find( result[i] ) ) //i在匹配M中，但是从与i相邻的节点出发可以有增广路<br />&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; result[i] = a; //记录查找成功记录<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true; //返回查找成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return false;<br />}<br /><br />int main()<br />{<br />&nbsp;&nbsp;&nbsp; init();<br />&nbsp;&nbsp;&nbsp; for (int i = 1; i &lt;= n1; i++)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(state, 0, sizeof(state)); //清空上次搜索时的标记<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( find(i) ) ans++; //从节点i尝试扩展<br />&nbsp;&nbsp;&nbsp; }&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; printf("%d\n", ans);<br />&nbsp;&nbsp;&nbsp; return 0;<br />}</div><img src ="http://www.cppblog.com/Smile3/aggbug/151097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-15 21:11 <a href="http://www.cppblog.com/Smile3/articles/151097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hnu第一场   Equivalent Sets  强连通分量 添加边使其成为一个强连通分量</title><link>http://www.cppblog.com/Smile3/articles/151071.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Fri, 15 Jul 2011 09:22:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151071.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151071.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151071.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151071.html</trackback:ping><description><![CDATA[<div>考察知识点：强连通分量的的求法<br />bug：注意强连通分量个数只有一个的情况<br />思维：这个转化倒是知道，但是知识点不足，还有一个更重要的是邻接表的写法和邻接矩阵的写法有很多的不同，特别是在第二次dfs的时候注意元素的表示不是i了而应该是<div> for( int i= 0; i&lt;num; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ b[cur][i] ] == 0&nbsp; )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(b[cur][i],sig);<br />再贴一个tyvj的纯裸的强连通分量：tvvj1111<br /><div>#include&lt;cstdio&gt;<br />#include&lt;cstring&gt;<br />#include&lt;iostream&gt;<br />using namespace std;<br />#define&nbsp; max 210<br />int a[max][max],b[max][max];//a为图G的邻接矩阵，b为图G的反图的邻接矩阵<br />int&nbsp; bleg[max];<br />int flag[max];<br />int numb[max];<br />int n;<br />void vistone(int cur,int &amp;sig)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[cur] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[i] == 0 &amp;&amp; a[cur][i] == 1 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(i,sig );<br />&nbsp;&nbsp;&nbsp;&nbsp; numb[++sig] = cur;<br />}<br />void visttwo( int cur ,int sig)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[cur] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; bleg[cur] =sig;<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i= 1; i&lt;=n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[i] == 0 &amp;&amp; b[cur][i] == 1 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(i,sig);<br />}&nbsp;&nbsp;&nbsp; &nbsp;<br />int korareju()<br />{<br />&nbsp;&nbsp;&nbsp; int sig =0;<br />&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp; for( int i=1;i&lt;=n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[i] == 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(i,sig);<br />&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp; sig=0;<br />&nbsp;&nbsp;&nbsp; for(int i=n; i&gt;=1; --i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ numb [i] ] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(numb[i], (++sig) );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return sig;<br />}<br />int main()<br />{<br />&nbsp;&nbsp;&nbsp; scanf("%d",&amp;n);<br />&nbsp;&nbsp;&nbsp; int i = 0;<br />&nbsp;&nbsp;&nbsp; memset(a,0,sizeof(a));<br />&nbsp;&nbsp;&nbsp; memset(b,0,sizeof(b));<br />&nbsp;&nbsp;&nbsp; while( (i++)&lt;n )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while( true )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( x == 0)<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; a[i][x] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[x][i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; int w = korareju();<br />&nbsp;&nbsp;&nbsp; printf("%d\n",w);<br />&nbsp;&nbsp;&nbsp; return 0;<br />}<br />&nbsp;&nbsp;&nbsp;</div><br /><br /></div>#include&lt;cstdio&gt;<br />#include&lt;cstring&gt;<br />#include&lt;iostream&gt;<br />#include&lt;vector&gt;<br />using namespace std;<br />#define&nbsp; max 20010<br />vector&lt; int &gt; a[max],b[max];//a为图G的邻接矩阵，b为图G的反图的邻接矩阵<br />int&nbsp; bleg[max];<br />int flag[max];<br />int numb[max];<br />int out[max];<br />int in[max];<br />int n;<br />void vistone(int cur,int &amp;sig)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[cur] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = a[cur].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i=0; i&lt;num; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ a[cur][i] ] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(a[cur][i],sig );<br />&nbsp;&nbsp;&nbsp;&nbsp; numb[++sig] = cur;<br />}<br />void visttwo( int cur ,int sig)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; flag[cur] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp; bleg[cur] =sig;<br />&nbsp;&nbsp;&nbsp;&nbsp; int num = b[cur].size();<br />&nbsp;&nbsp;&nbsp;&nbsp; for( int i= 0; i&lt;num; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ b[cur][i] ] == 0&nbsp; )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo(b[cur][i],sig);<br />}&nbsp;&nbsp;&nbsp; &nbsp;<br />int korareju()<br />{<br />&nbsp;&nbsp;&nbsp; int sig =0;<br />&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp; for( int i=1;i&lt;=n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[i] == 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistone(i,sig);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp;&nbsp; sig=0;<br />&nbsp;&nbsp;&nbsp; for(int i=n; i&gt;=1; --i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[ numb[i] ] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visttwo( numb[i], (++sig) );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return sig;<br />}<br />int main()<br />{<br />&nbsp;&nbsp;&nbsp; int m;<br />&nbsp;&nbsp;&nbsp; while( scanf("%d%d",&amp;n,&amp;m) == 2 )<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp; int k = 0;<br />&nbsp;&nbsp;&nbsp; memset(a,0,sizeof(a));<br />&nbsp;&nbsp;&nbsp; memset(b,0,sizeof(b));<br />&nbsp;&nbsp;&nbsp; memset(numb,0,sizeof(numb));<br />&nbsp;&nbsp;&nbsp; memset(out,0,sizeof(out));<br />&nbsp;&nbsp;&nbsp; memset(in,0,sizeof(in));<br />&nbsp;&nbsp;&nbsp; memset(bleg,0,sizeof(bleg));<br />&nbsp;&nbsp;&nbsp; while( (k++)&lt;m )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x,y;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d",&amp;x,&amp;y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[x].push_back(y);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[y].push_back(x);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; if( n &lt;= 1 )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("0\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; int w = korareju();<br />&nbsp;&nbsp;&nbsp; if( w == 1 )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("0\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; for( int i=1; i&lt;=n; ++i )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num = a[i].size();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0; j&lt;num; ++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( bleg[i] != bleg[ a[i][j] ] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out[bleg[i]]++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in[ bleg[ a[i][j] ] ]++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; int od=0;<br />&nbsp;&nbsp;&nbsp; int id=0;<br />&nbsp;&nbsp;&nbsp; for( int i= 1; i&lt;=w; ++i)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( out[i] == 0 )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; od++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( in[i] == 0 ) &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id++;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; int max0=od;<br />&nbsp;&nbsp;&nbsp; if(max0&lt;id)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max0=id;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; printf("%d\n",max0);<br />&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}</div><img src ="http://www.cppblog.com/Smile3/aggbug/151071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-15 17:22 <a href="http://www.cppblog.com/Smile3/articles/151071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hnu第一场  Earth Hour 《单源最短路》</title><link>http://www.cppblog.com/Smile3/articles/151069.html</link><dc:creator>Smile3</dc:creator><author>Smile3</author><pubDate>Fri, 15 Jul 2011 08:51:00 GMT</pubDate><guid>http://www.cppblog.com/Smile3/articles/151069.html</guid><wfw:comment>http://www.cppblog.com/Smile3/comments/151069.html</wfw:comment><comments>http://www.cppblog.com/Smile3/articles/151069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Smile3/comments/commentRss/151069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Smile3/services/trackbacks/151069.html</trackback:ping><description><![CDATA[<div>这是一个单源最短路的变形，枚举的是关节点；<br />小技巧：在开始用三次dijstra算法求出三个关键点到所有其他点的距离，保存下来，枚举关节点时就不要每一次都求解，以节省时间，否则会超时。<br />思维：这里卡的是转换过程，另外一个是知识点，对于知识点现在已经学过了，以后要加油，对于思维的转化，还是要靠经验的积累和考场的思考。<br />#include&lt;cstdio&gt;<br />#include&lt;iostream&gt;<br />#include&lt;cstring&gt;<br />using namespace std;<br />#define INF 10000000<br />int a[210][3];<br />int l[210][210];<br />int d1[210],d2[210],d3[210];<br />void initiate(int n)<br />{<br />&nbsp;&nbsp; for( int i=0; i&lt;n; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0; j&lt;n; ++j )<br />&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int r = a[i][2]+a[j][2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len = ( a[i][0] - a[j][0] )*( a[i][0] - a[j][0] ) + ( a[i][1] - a[j][1] )*( a[i][1] - a[j][1] );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( r*r &gt;= len )<br />&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; l[i][j] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l[j][i] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;n; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l[i][i]=0;<br />} <br />void dijstra(int i,int n,int d[])//每一次选取已有集合的最小d值,更新其他d值<br />{<br />&nbsp;&nbsp; d[i] = 0;<br />&nbsp;&nbsp; int flag[210];<br />&nbsp;&nbsp; memset(flag,0,sizeof(flag));<br />&nbsp;&nbsp; int tt=n;<br />&nbsp;&nbsp; while( tt-- )<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int max =INF ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int j=0; j&lt; n; j++ )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( d[j] &lt; max &amp;&amp; (flag[j] == 0) )<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; max = d[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num = j;&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; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flag[num] = 1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int t=0; t&lt;n; ++t )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( flag[t] == 0 &amp;&amp; l[num][t] == 1 )<br />&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; if( d[t] &gt; (d[num]+1) )<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; d[t] = d[num]+1;<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; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br />int main()<br />{<br />&nbsp;&nbsp;&nbsp; int t;<br />&nbsp;&nbsp;&nbsp; scanf("%d",&amp;t);<br />&nbsp;&nbsp;&nbsp; while( t-- )<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(l,0,sizeof(l));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //printf("n:%d\n",n);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int i=0; i&lt;n; ++i )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d%d%d",&amp;a[i][0],&amp;a[i][1],&amp;a[i][2]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int w=n;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initiate(w);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int k=0; k&lt;210; ++k )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d1[k] = INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d2[k] = INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d3[k] = INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijstra(0,n,d1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijstra(1,n,d2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijstra(2,n,d3);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int min =INF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( int j=0; j&lt;n; ++j)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( min &gt; d1[j]+d2[j]+d3[j] )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; min = d1[j]+d2[j]+d3[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( min == INF )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("-1\n");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d\n",(n-min-1));<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return 0;<br />}</div><img src ="http://www.cppblog.com/Smile3/aggbug/151069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Smile3/" target="_blank">Smile3</a> 2011-07-15 16:51 <a href="http://www.cppblog.com/Smile3/articles/151069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>