确定是否可以将所有用户连接到手机信号塔? [多项式时间算法]

时间:2013-12-03 04:07:45

标签: algorithm

鉴于


用户 u1,...,嗯 每个用户都被给出:用户可以连接的手机信号塔列表 {s1,... sn}

手机信号塔 c1,.... cn
给出每个细胞塔:容量cp

问题:是否可以在不超出容量的情况下将所有用户连接到手机信号塔?

我的方法:

if sum(total_cell_capacity) < sum(total_users): 
    return false  #Joy Z's idea

sort users by number of available towers to them (ascending order)  
for each user:
    if user only have one tower availble to them:
        if tower is not full:
            allocate user to the tower
            tower_capacity --
        else:
            return false
    else:
        choose cell tower with biggest current capacity:
            allocate user to the tower
            tower_capacity --
return true

这会产生多项式时间吗?这个算法至少会解决这个问题吗?

*我正在尝试学习如何在stackoverflow上写得更好 *请修正我的错误。

提前致谢。

2 个答案:

答案 0 :(得分:1)

我认为这又是分配问题。每个用户都是需要做的工作。对于每个蜂窝塔,根据其容量创建一些工人。用户可以连接的单元塔列表告诉您哪个工作人员可以执行哪些作业而不会受到惩罚。 http://en.wikipedia.org/wiki/Assignment_problem告诉您如何解决此问题/最小化惩罚匈牙利算法。

答案 1 :(得分:1)

这会降低到最大基数匹配问题,并且可以使用Hopcroft-Karp algorithm O(maxCp mn Sqrt(m + maxCp n))时间内求解。如果 maxCp 有界限,则减少为 O(mn Sqrt(m + n))

详细说明:定义一组用户节点 U = {u1,u2,..,um} 和一组单元塔插槽节点

C = {c11, .., c_{1,cp(1)}, c_{2,1}, .., c_{2,cp(2)}, .., c_{n, 1}, c_{n, cp(n)}

现在在每个用户节点和节点之间为她可以连接的每个单元塔插槽添加一条边,形成一个二分图。然后,您的问题会缩小到图中最大基数匹配是否大小 m 的问题。如果是,则每个用户都可以连接到某个蜂窝塔插槽。如果不是,它必须小于 m (它不能更多,因为我们只有 m 用户节点)。

给定 V 节点和 E 边缘的二分图,Hopcroft-Karp算法在时间O(E Sqrt(V))中解决了最大基数问题。由于我们最多只有 maxCp mn 边缘和最多 maxCp n + m 节点,因此我们得到 O的运行时间(maxCp mn Sqrt(maxCp n + m)) )