Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 贪婪最大流_Algorithm_Greedy_Max Flow - Fatal编程技术网

Algorithm 贪婪最大流

Algorithm 贪婪最大流,algorithm,greedy,max-flow,Algorithm,Greedy,Max Flow,用餐问题: 几个家庭一起出去吃饭。为了增加他们的社会交往,他们喜欢坐在桌子旁,这样同一个家庭的两个成员就不会坐在同一张桌子上了。假设晚餐特遣队有p家庭,而ith家庭有a(i)成员。此外,假设有可用的q桌子,并且jth桌子的座位容量为b(j) 问题是: 我们最多可以坐多少人 编辑: 这个问题可以通过创建一个图并运行最大流算法来解决。但是如果我们使用Dinic算法有2*10^3个顶点,那么全局复杂度是O(10^6*10^6)=O(10^12) 如果我们总是以贪婪的方式坐在大团体的前面。复杂度为O(1

用餐问题:
几个家庭一起出去吃饭。为了增加他们的社会交往,他们喜欢坐在桌子旁,这样同一个家庭的两个成员就不会坐在同一张桌子上了。假设晚餐特遣队有
p
家庭,而
i
th家庭有
a(i)
成员。此外,假设有可用的
q
桌子,并且
j
th桌子的座位容量为
b(j)

问题是: 我们最多可以坐多少人

编辑: 这个问题可以通过创建一个图并运行最大流算法来解决。但是如果我们使用Dinic算法有2*10^3个顶点,那么全局复杂度是O(10^6*10^6)=O(10^12)

如果我们总是以贪婪的方式坐在大团体的前面。复杂度为O(10^6)

因此,我的问题是:

1) 贪婪方法在这个问题上有效吗


2) 解决这个问题的最佳算法是什么?

是的,贪婪地将最大的家庭排在第一位是正确的解决方案。我们只需要证明,在我们让下一个最大的家庭入座后,有一种方法可以让其余的家庭正确入座

假设一个实例是可解的。我们通过归纳证明了贪婪算法求解
k
最大族后存在解。基础
k=0
是显而易见的,因为要证明的假设是存在解。归纳地,假设存在一个解决方案,该解决方案扩展了贪心对第一个
k-1
族的部分赋值。现在贪婪扩展了它的部分赋值,将
k
th族放入其中。我们编辑已知的解来恢复归纳假设


虽然我们仍然可以找到一张表,其中贪婪坐着一个
k
th家族成员,但已知的解决方案没有。如果已知解决方案中
T1
处有空格,请将
k
th族成员从贪婪没有空格的表中移出。否则,已知解决方案中的一个家庭成员不在
k
最大的家庭中,位于
T1
。由于该族比第
k
th大族小,因此第
k
th大族成员占据的表
T2
,较小族没有。交换这些成员。

很容易想出这样的例子,即这样的座位根本不可能,因此,假设问题是可以解决的,下面是一个解决问题的伪代码:

Sort each family i by a(i) in decreasing order
Add each table j to a max-heap with b(j) as the key

For each family i from the sorted list:
    Pop a(i) tables from max-heap
    Add one member of i to each table
    Add each table j back into the max-heap with b(j) = b(j) - 1
n=a(1)+a(2)+…+a(p)
(即总人数)

假设最大堆使用二进制堆,则时间复杂度为:

  • 排序族:
    O(plog(p))
  • 初始化最大表堆:
    O(qlog(q))
  • 所有到最大堆的弹出和推送:
    O(nlog(q))
给出
O(plog(p)+qlog(q)+nlog(q))
的总时间复杂度,其中
O(nlog(q))
可能占主导地位

由于我们处理的是整数,如果我们对最大堆使用1D桶系统,使得
c
是最大
b(j)
,那么我们将得到
O(n+c)
(假设最大堆操作占主导地位),这可能更快


最后,请投票支持大卫的答案,因为证据是必需的,而且非常棒。

对于计算机科学SE来说,这可能是一个更好的问题。