并查集练习---poj 1417 并查集+DP

该博客讨论了如何使用并查集解决POJ 1417问题,强调了在处理朋友和敌人关系时不应分开维护集合,并解释了如何通过并查集确定两个元素是否属于同一集合。
摘要由CSDN通过智能技术生成

这到题倒是和team them up 有些类似。

很容易得到:回答yes ,则x和y是相同集合的,反之,则是不同集合的。

首先用friend-enemy 并查集,注意:不要将朋友和敌人分开维护,这样容易出错。

得到了若干集合,每个集合有两个数,a和b。

现在要求n个集合中各挑出一个数(a或者b),使得他们之和等于p1(说真话的人数)。而这个用dp可以很好的解决,用f[i][j]表示
到第i个集合和为j个的情况数,我们还用过pre[i][j]记录当前选的是a还是b,用于后面判断状态。方程为
f[i][j] = f[i–1][j–a] + f[i–1][j–b],j>=a,j>=b。如果最后f[n][p1] == 1说明是唯一的情况,输出该情况,
否则输出 “no”(多解算no)
注意点 : 按上面的dp写法,f[i][j]可能会很大,因为n可以达到三位数。其实我们关心的只是f[i][j] 等于0,等于1,
大于1三种情况,所以当f[i][j] > 1时,我们都让它等于2即可

【代码】

#includ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值