有两个集合, 一个集合里面有N个不同盒子, 另一个集合里面有M个球,
把M个球分配到N个盒子里.
盒子和球的特点: 每个盒子有不同编号, 即每个盒子都不同,容量无限;
球不能任意放, 每个球都带有一个list, 上面记着可以放这个球的盒子,
即每个球只能放到特定的某几个盒子.
要求尽量减少球最多的那个盒子里面的球数, 也就是尽量平均放~
只需要输出球数最多的那个盒子里面放的球的数量就好
求帮忙~实在想不出一个有效的算法...给个思路就好~
可能表述的不清楚, 加个input和output的格式方便大侠们理解
input:
3 6 //3盒子和6个球
1
2
3 //盒子编号1,2,3
a 2 //a球只能放2
b 1 3 //b球可以放在1也可以放在3
c 1 2 3
d 2 3
e 2
f 1
然后output就是2
还是挺复杂的,是个二分图匹配算法,而二分匹配的算法需要使用
网络流算 法,不知道你听说过这个没有,如果没听过的话最好先查
一下相关的资料。总的思路是:首先随便找出一个放法,求出一个
上界(或者直接取M作为上界也行);然 后用二分法,每次尝试每
个盒子里最多放K个球的时候能不能放下;用二分法找出K个球能放
下,K-1个球放不下的时候,就算出了最多盒子里球的最少数目。
首先按照数据构造一个二分图:左边是M个球,右边是N个盒子,
如果某个球能放入这个盒子,就在两个顶点中间连一条有向边,从
左到右。这种顶点分成两个集合、只有集合之间才有连接的称为二分图。
然后将二分图构造成一个网络:
增加一个源点s、一个汇点t,源点s到所有左边的M个球的节点增加
一条有向边,流量限制为1;原来二分图中所有的有向边,流量限制
为1;右边N个盒子中每个节点到汇点t增加一条有向边,限制当前每个
盒子最多放的球数量为K的时候,流量限制为K。
对这个网络模型,求源点s到汇点t的最大流。如果最大流的流量为M,
说明M个球可以全都放进N个盒子里,K满足条件;否则K不满足条件。
至于网络流的解法,有增广路径和预留推进两种算法,对这个问题来说
两个算法的复杂度都是O(M^3)量级。再加上二分法的消耗,总的算法
复杂度为O(M^3logM)。虽然不算特别快但是比搜索还是强太多了。