ACM PKU POJ 1112 解题报告

问题描述:给定 n (1 < n < 101) 个人,以及信息某个人 i 是否认识 j (1<=i<=n, 1<=j<=n, i != j),你的任务是把这 n 个人分成大小近可能相近的两队,使得 1)每个人属于且只属于某一队;2)每个队的大小至少为 1;3)每个队的成员都相互认识。详见:http://acm.pku.edu.cn/JudgeOnline/problem?id=1112

这题不难,但题目不错。最直接的思路是:首先建立一个朋友网络,顶点是每一个人,如果两个人相互认识,则连一条边。然后在这个图上求两个大小相近的完全子图。如果做不到,则问题无解。这个思路的难点在于,一下子想不出已知的简单的算法来未两个大小相近的完全子图。至少,本人想不到现成的~

直接的反面就是间接。与其求朋友网络,不如求 “敌人” 网络:如果两个人之间不是相互认识,则连一条边。这样,每条边的两个结点就不可能被安排到同一个组。于是,问题就变成了一个二部图问题。首先,判定是不是二部图,这个容易,广度优先和深度优先都能做到;其次,如果是二部图,把二部图的两个部分求出来,这个也很直观了,在判定是否为二部图可以顺便做到。

直到现在为止,我们讨论的只是单一连通图的情况。这种情况下,无所谓大小相近:如果有解,解是惟一的。实际的情况是,这个“敌人” 网络可能包含有多个连通子图。如果每个连通子图都是二部图,则有解。这时,就需要在每个连通子图中选择合适的一方来加入某个队,从而使得两个队的大小相近。这时,动态规划就派上用场了。

令 cc[1..k] 表示 k 个连接子图,cc[i][blue|red] 表示二部图 cc[i] 中的红方和蓝方。假定最优解的两个队的为数为 max 和 min,max >= min。则人数之差 d = max - min = n - 2*min。d 最小,则 min 最大,且不超 n/2。考虑这样的背包问题:有 k 种物品,每种物品有蓝色和红色各一个,物品的价值 value 和重量 weight 相同,用product[i][blue | red] 表示。现在有一背包大小为 n/2,要选 n 种不同的物品(在不同的颜色之间选一种)装进背包里,并使其价值最大。显然,这只是经典0/1 背包问题的一个变种。经典问题为 “选或不选”,现在问题为 “选蓝色还是红色”。把每个二部图的蓝方和红色看成一物品,其价值和其重量为其结点个数,则求最大 min 变成了求解上述背包问题。

至此,问题得解。总结一下整理思路:

1)通过输入建立朋友网络图

2)通过朋友网络图求 “敌人” 网络图

3)用 BFS 或 DFS 求解连通分支,并算出每个分支的蓝方和红方,同时判断问题是否可解

4)把每个分支的每一方当种物品,求解上述的背包问题

 

这题不难,但却用到了二部图、求连通分支以及经典背包问题变种等知识和技巧,而且还不是直接就可以看出应该如此求解,还得先进行一步转换(即把朋友网络转成 “敌人” 网络),确实是好题。当然,动态规划部分不一定得套用背包问题,例如,可以考虑状态 f(i, d) ,前 i 个分支中,是否存在一种分组方式,使得两队人数之差为 d(可正可负)。于是,问题的解为使得 f(k, d)=true 的绝对值最小的那一个d。这个思路也很直观。不过,个人喜欢把未知问题转换成已知问题来求解的思路。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值