<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Would You share! &#187; 解题报告</title>
	<atom:link href="http://www.5ushare.com/tag/%e8%a7%a3%e9%a2%98%e6%8a%a5%e5%91%8a/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.5ushare.com</link>
	<description>Charlie Wu&#039;s blog</description>
	<lastBuildDate>Wed, 01 Sep 2010 09:28:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>POJ3020【最大匹配】</title>
		<link>http://www.5ushare.com/poj3020/</link>
		<comments>http://www.5ushare.com/poj3020/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 11:08:32 +0000</pubDate>
		<dc:creator>Charlie</dc:creator>
				<category><![CDATA[ACM Life]]></category>
		<category><![CDATA[POJ3020]]></category>
		<category><![CDATA[解题报告]]></category>

		<guid isPermaLink="false">http://www.5ushare.com/?p=45</guid>
		<description><![CDATA[<strong>题目大意：
</strong> 给出一张图，图中元素为'*'或者'o'。其中，相连的两个’*'可以划入一个圈中。问至少需要几个圈将所有的'*'画起来。]]></description>
			<content:encoded><![CDATA[<p><strong>原题描述：</strong><br />
<a href="http://acm.pku.edu.cn/JudgeOnline/problem?id=3020" target="_blank">见原题</a></p>
<p><strong>题目大意：<br />
</strong> 给出一张图，图中元素为&#8217;*'或者&#8217;o'。其中，相连的两个’*&#8217;可以划入一个圈中。问至少需要几个圈将所有的&#8217;*'画起来。</p>
<p><strong>解题思路：<br />
</strong> 若两个点都为&#8217;*'且相连，则这两个点间有边。图中每个点化ij化为新点 i*w + j（以表示出所有点）。于是，最大匹配问题就明朗了。</p>
<p>代码：</p>
<p>#include &lt;stdio.h&gt;<br />
#include &lt;string.h&gt;<br />
#define MAXN 410<br />
#define _clr(x) memset(x,0xff,sizeof(int)*MAXN)</p>
<p>int hungary(int m,int n,int mat[][MAXN],int* match1,int* match2){<br />
int s[MAXN],t[MAXN],p,q,ret=0,i,j,k;<br />
for (_clr(match1),_clr(match2),i=0;i&lt;m;ret+=(match1[i++]&gt;=0))<br />
for (_clr(t),s[p=q=0]=i;p&lt;=q&amp;&amp;match1[i]&lt;0;p++)<br />
for (k=s[p],j=0;j&lt;n&amp;&amp;match1[i]&lt;0;j++)<br />
if (mat[k][j]&amp;&amp;t[j]&lt;0){<br />
s[++q]=match2[j],t[j]=k;<br />
if (s[q]&lt;0)<br />
for (p=j;p&gt;=0;j=p)<br />
match2[j]=k=t[j],p=match1[k],match1[k]=j;<br />
}<br />
return ret;<br />
}</p>
<p>int main(int argc, char *argv[]){<br />
int iTest;<br />
scanf(&#8220;%d&#8221;,&amp;iTest);<br />
int map_ap[410][410];<br />
while(iTest&#8211;){<br />
int h,w;<br />
scanf(&#8220;%d %d&#8221;,&amp;h,&amp;w);<br />
int i,k;<br />
int map_in[40][10];<br />
int n = 0;<br />
for(i = 0; i &lt; h * w; ++i){<br />
for(k = 0; k &lt; h * w; ++k){<br />
map_ap[i][k] = 0;<br />
}<br />
}<br />
for(i = 0; i &lt; h; ++i){<br />
char sentense_in[12];<br />
scanf(&#8220;%s&#8221;,&amp;sentense_in);<br />
for(k = 0; k &lt; w; ++k){<br />
if(&#8216;o&#8217; == sentense_in[k]){<br />
map_in[i][k] = 0;<br />
}else if(&#8216;*&#8217; == sentense_in[k]){<br />
map_in[i][k] = 1;<br />
n++;<br />
if(i){<br />
if(map_in[i - 1][k]){<br />
map_ap[i * w + k][(i - 1) * w + k] = 1;<br />
map_ap[(i - 1) * w + k][i * w + k] = 1;<br />
}<br />
}<br />
if(k){<br />
if(map_in[i][k - 1]){<br />
map_ap[i * w + k][i * w + k - 1] = 1;<br />
map_ap[i * w + k - 1][i * w + k] = 1;<br />
}<br />
}<br />
}else{<br />
k&#8211;;<br />
}<br />
}<br />
}<br />
int m1[410],m2[410];<br />
printf(&#8220;%d\n&#8221;,n &#8211; hungary(h * w,h * w,map_ap,m1,m2) / 2);<br />
}<br />
return 0;<br />
}</p>
<h4>Incoming search terms for the article:</h4><ul><li><a href="http://www.5ushare.com/poj3020/" title="acm fzu include">acm fzu include</a></li><li><a href="http://www.5ushare.com/poj3020/" title="poj3020">poj3020</a></li></ul><!-- SEO SearchTerms Tagging 2 plugin took 0.913 ms -->]]></content:encoded>
			<wfw:commentRss>http://www.5ushare.com/poj3020/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>POJ2524【并查集】</title>
		<link>http://www.5ushare.com/poj2524/</link>
		<comments>http://www.5ushare.com/poj2524/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 12:10:37 +0000</pubDate>
		<dc:creator>Charlie</dc:creator>
				<category><![CDATA[ACM Reports]]></category>
		<category><![CDATA[ACM]]></category>
		<category><![CDATA[POJ]]></category>
		<category><![CDATA[解题报告]]></category>

		<guid isPermaLink="false">http://www.5ushare.com/?p=34</guid>
		<description><![CDATA[<strong><span style="font-size: large;">题目大意：</span></strong>
给出几个人两两之间的信仰相同；要求给出最多有多少个不同的信仰集合；
<strong><span style="font-size: large;">数据范围：</span></strong>
学生数0---50000；
<strong><span style="font-size: large;">边界数据：</span></strong>
几乎没有；
<strong><span style="font-size: large;">可能陷进：</span></strong>
几乎没有；]]></description>
			<content:encoded><![CDATA[<h2>POJ2524【并查集】</h2>
<div id="postmessage_22" class="t_msgfont"><strong><span style="font-size: large;">题目描述：</span></strong></p>
<p>Ubiquitous Religions</p>
<table class="t_table" border="0" cellspacing="0">
<tbody>
<tr>
<td><strong>Time Limit:</strong> 5000MS</td>
<td width="10"></td>
<td><strong>Memory Limit:</strong> 65536K</td>
</tr>
<tr>
<td><strong>Total Submissions:</strong> 5586</td>
<td></td>
<td><strong>Accepted:</strong> 2346</td>
</tr>
</tbody>
</table>
<p>Description<br />
Thereare so many different religions in the world today that it is difficultto keep track of them all. You are interested in finding out how manydifferent religions students in your university believe in.</p>
<p>You know that there are n students in your university (0 &lt; n&lt;= 50000). It is infeasible for you to ask every student theirreligious beliefs. Furthermore, many students are not comfortableexpressing their beliefs. One way to avoid these problems is to ask m(0 &lt;= m &lt;= n(n-1)/2) pairs of students and ask them whether theybelieve in the same religion (e.g. they may know if they both attendthe same church). From this data, you may not know what each personbelieves in, but you can get an idea of the upper bound of how manydifferent religions can be possibly represented on campus. You mayassume that each student subscribes to at most one religion.<br />
Input<br />
Theinput consists of a number of cases. Each case starts with a linespecifying the integers n and m. The next m lines each consists of twointegers i and j, specifying that students i and j believe in the samereligion. The students are numbered 1 to n. The end of input isspecified by a line in which n = m = 0.<br />
Output<br />
Foreach test case, print on a single line the case number (starting with1) followed by the maximum number of different religions that thestudents in the university believe in.<br />
Sample Input<br />
10 9<br />
1 2<br />
1 3<br />
1 4<br />
1 5<br />
1 6<br />
1 7<br />
1 8<br />
1 9<br />
1 10<br />
10 4<br />
2 3<br />
4 5<br />
4 8<br />
5 8<br />
0 0<br />
Sample Output<br />
Case 1: 1<br />
Case 2: 7<br />
Hint<br />
Huge input, scanf is recommended.<br />
<strong><span style="font-size: large;">题目大意：</span></strong><br />
给出几个人两两之间的信仰相同；要求给出最多有多少个不同的信仰集合；<br />
<strong><span style="font-size: large;">数据范围：</span></strong><br />
学生数0&#8212;50000；<br />
<strong><span style="font-size: large;">边界数据：</span></strong><br />
几乎没有；<br />
<strong><span style="font-size: large;">可能陷进：</span></strong><br />
几乎没有；<br />
<strong><span style="font-size: large;">AC代码：</span></strong><br />
#include &#8220;stdio.h&#8221;<br />
#include &#8220;iostream&#8221;<br />
using namespace std;<br />
int root[100001];<br />
int heav[100001];<br />
void makeset(int i)<br />
{<br />
root<em> = i;<br />
heav<em> = 1;<br />
}<br />
int findset(int i)<br />
{<br />
if (root<em> != i)<br />
root<em> = findset(root<em>);<br />
return root<em>;<br />
}<br />
void unio(int i, int j)<br />
{<br />
if (heav<em> &gt; heav[j])<br />
{<br />
root[j] = i;<br />
heav<em> = heav<em> + heav[j];<br />
}<br />
else if (heav<em> &lt; heav[j])<br />
{<br />
root<em> = j;<br />
heav[j] = heav<em> + heav[j];<br />
}<br />
else<br />
{<br />
root[j] = i;<br />
heav<em> = heav<em> + heav[j];<br />
}<br />
}<br />
int main()<br />
{<br />
//freopen(&#8220;e:\\in.txt&#8221;, &#8220;r&#8221;, stdin);<br />
int count, n;<br />
int p, q;<br />
int t, k;<br />
int testcase = 0;<br />
while(scanf(&#8220;%d%d&#8221;, &amp;count, &amp;n) != EOF)<br />
{<br />
if (count == 0 &amp;&amp; n == 0) break;<br />
testcase++;<br />
for (int i = 1; i &lt;= count; ++i)<br />
makeset(i);<br />
while(n&#8211;)<br />
{<br />
scanf(&#8220;%d%d&#8221;, &amp;p,&amp;q);<br />
t = findset(p);<br />
k = findset(q);<br />
if (t != k)<br />
{<br />
count&#8211;;<br />
unio(t, k);<br />
}</p>
<p>}<br />
printf(&#8220;Case %d: %d\n&#8221;,testcase, count);<br />
}<br />
return 0;<br />
}</em></em></em></em></em></em></em></em></em></em></em></em></em></em></div>
]]></content:encoded>
			<wfw:commentRss>http://www.5ushare.com/poj2524/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
