摘要: http://poj.org/problem?id=1703 跟2492基本一样,不多说。code:#include<cstdio>usingnamespacestd;intf[100005];intr[100005];intn,m;intfind_Set(intx){inttemp;if(x==f[x]){returnx;}temp=f[x];f[x]=find_Set(temp);r[x]=(r[x]+r[temp])%2;//保持r[x]相对于根节点的稳定returnf[x];}voidUnion(intx,inty,intfx,intfy){f[fy]=fx;r[fy]=( 阅读全文
posted @ 2012-01-30 22:32 追逐. 阅读(173) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2524 依旧简单并查集,拿1611火速改了改火速提交,果断PE...把输出的最后一个空格放%d前面了,真活该不运行就交。 但是这题有个疑问,为什么按秩合并没有比直接合并快??code:#include<cstdio>intp[50005],r[50005];voidmake_set(intn){for(inti=0;i<n;i++){p[i]=i;r[i]=0;}}intfind_set(intx){if(x!=p[x])p[x]=find_set(p[x]);returnp[x];}voidunion_set(intx, 阅读全文
posted @ 2012-01-30 21:48 追逐. 阅读(183) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1611 简单入门并查集,以前已经做过,但是代码不太好。DP优化搞上火了,做做别的换换脑子... 以前代码Memory:356KTime:32MS#include<cstdio>usingnamespacestd;constintmaxn=30000;intfather[maxn+5];//记录父节点intlen[maxn+5];//记录以该点为根的集合元素的个数voidinit(intn){//并查集的初始化inti;for(i=0;i<n;i++){father[i]=i;len[i]=1;}}inlineintgetr 阅读全文
posted @ 2012-01-30 21:33 追逐. 阅读(183) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2392 背包没有容量,对于每种木块,其能达到的最大高度a便可做为其容量。先用二进制优化减少数量,然后根据a的值排序,01背包时可以以每种木块可达到的最大高度为最大容量。RE一次,因为val的大小只开了401...这里是个易错点啊,二进制优化后的数量不确定。代码:#include<cstdio>#include<cstring>#include<cstdlib>#defineMax(a,b)a>b?a:bintdp[40005];structBlock{inth;inta;}val[4001];int 阅读全文
posted @ 2012-01-30 03:51 追逐. 阅读(218) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=1276 有一个Cash Machine,里面装有t种面值为n[i]的货币,每种有v[i]张。问在所换金额不超过cash元钱的情况下,所能换取的最大金额。 多重背包,转换成01背包来做,其中要用到二进制优化。《背包九讲》上讲的挺不错,在每件物品价值前加上系数,并保证这些系数的组合包括1..n的所有数且总和为n。代码:#include<cstdio>#include<cstring>#defineMax(a,b)a>b?a:bintdp[100005];intval[105];intmain(){intcash,n 阅读全文
posted @ 2012-01-30 01:47 追逐. 阅读(174) 评论(0) 推荐(0) 编辑