ACM东西 - 喂养动物

时间:2014-12-23 11:34:15

标签: algorithm

有一个ACM问题,我很难解决。如果有人能告诉我如何处理它?我真的很感激!

  

描述

     

要向主显示你的智慧,你必须按如下方式解决问题:   假设有m个人和n个动物。如果动物喜欢动物,则可以和平地喂养动物。   给出一个哪个人喜欢哪个动物的清单,你要确定是否可以和平地喂养所有动物   条件是每个人都可以喂养最多k只动物。

     

输入

     

将会有多个测试用例。对于每个测试用例,第一行包含两个整数m(1 <= m <= 100)和n(1 <= n <= 100),其中m表示人数,n表示数量动物。以下行包含m * n 0-1矩阵,表示哪个人喜欢哪个动物。如果第i行的第j个元素为1,则第j个动物喜欢第i个人。每个测试用例的最后一行包含一个整数k,表示一个人可以喂食的最大动物数。

     

输出

     

对于每个测试用例,如果所有动物都可以和平喂食则输出“是”,否则输出“否”。

     

样本输入

2 8
1 1 0 1 0 0 1 1
1 1 1 0 1 1 1 1
2
7 2
1 1
1 1
1 1
1 1
1 1
1 1
1 1
2
     

样本输出

No
Yes

1 个答案:

答案 0 :(得分:2)

可以使用 max-flow problem 解决此问题。

创建以下图表:

vertices:
V={s,t} U {persons} U {animals}
edges: 
E = { (s,p) | for each p in persons } U
    U {(p,a) | for each person liked by each animal} U 
    U {(a,t) | for each a in animal }
weight function on edges:
w(s,p) = k | for each p in person
w(p,a) = 1 for each p in persons and a in animals
w(a,t) = 1 for
graph:
G  = (V,E,w)

现在,您需要在s上找到从tG的最大整数流。这可以使用各种算法来解决,例如Ford-Fulkerson

达到t的流量是喂食的动物数量,解决方案本身由流量给出:

  • 如果边缘(p,a)上有一个流量(权重为1),那么p人就会为动物a提供动物。
  • 没有人投放超过k只动物,因为可以触及某人p的最大流量为k,因此k不能超过p {{1}} }}。