洛谷P1402 酒店之王

2022-02-27 09:43:43 字數 1486 閱讀 3297

洛谷連線:酒店之王

xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調、陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。

有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意(滿意的條件是住進喜歡的房間,吃到喜歡的菜)。

這裡要怎麼分配,能使最多顧客滿意呢?

輸入格式:

第一行給出三個正整數表示n,p,q(<=100)。

之後n行,每行p個數包含0或1,第i個數表示喜不喜歡第i個房間(1表示喜歡,0表示不喜歡)。

之後n行,每行q個數,表示喜不喜歡第i道菜。

輸出格式:

最大的顧客滿意數。

輸入樣例#1: 

2 2 2

1 01 0

1 11 1

輸出樣例#1:

1

首先分析一下題意:給出n個人,p間房,q道菜,乙個人只能要一間房,一道菜,如果乙個人得到了他要的房間和菜,就可以使這個顧客滿意,要統計最大的顧客滿意數。

那麼既然給出了限制條件,並且我們只需要知道最大的滿意數,並不需要知道方案如何。所以我們考慮用網路流來做。那麼我們肯定是要將人,房間和菜相連來跑最大流的。所以我們想要如何保證流通乙個人和菜和房間後,只能增加1的流量。首先我們可以想到拆點。可以把人,菜和房間都拆成兩個點,這樣就能保證流過這個點的時候流量最大為1。

但是這樣很顯然是把問題複雜化了,因為只給出了人和房間,菜品的關係,所以我們可以考慮這樣建圖:

把人和房間,人和菜品相連。

將房間和源點相連,菜品和匯點相連。

將人拆成兩個點限制流量。

這樣就可以比較簡單解決問題(當然如果全部拆點應該也能過)。

1 #include2

using

namespace

std;

3const

int n=3000+5;4

const

int inf=2147483647;5

6int

s, t;

7int

n, room, meal;

8int cnt = 1;9

intlast[n];

10int

lev[n];

11int ans = 0;12

13struct

edgee[1000005

];16

17void add(int x,int y,int

z)23

24bool

bfs()35}

36return lev[t] != -1;37

}3839int dfs(int x,int

flow)51}

52}53return

rest;54}

5556

intmain()

另外推薦一道相似的題:教輔的組成

洛谷 P1402 酒店之王

題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...

洛谷 P1402 酒店之王

題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...

洛谷 P1402 酒店之王

xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意 滿意的條...