洛谷連線:酒店之王
xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調、陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。
有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意(滿意的條件是住進喜歡的房間,吃到喜歡的菜)。
這裡要怎麼分配,能使最多顧客滿意呢?
輸入格式:
第一行給出三個正整數表示n,p,q(<=100)。
之後n行,每行p個數包含0或1,第i個數表示喜不喜歡第i個房間(1表示喜歡,0表示不喜歡)。
之後n行,每行q個數,表示喜不喜歡第i道菜。
輸出格式:
最大的顧客滿意數。
輸入樣例#1:
2 2 21 01 0
1 11 1
輸出樣例#1:
1把人和房間,人和菜品相連。首先分析一下題意:給出n個人,p間房,q道菜,乙個人只能要一間房,一道菜,如果乙個人得到了他要的房間和菜,就可以使這個顧客滿意,要統計最大的顧客滿意數。
那麼既然給出了限制條件,並且我們只需要知道最大的滿意數,並不需要知道方案如何。所以我們考慮用網路流來做。那麼我們肯定是要將人,房間和菜相連來跑最大流的。所以我們想要如何保證流通乙個人和菜和房間後,只能增加1的流量。首先我們可以想到拆點。可以把人,菜和房間都拆成兩個點,這樣就能保證流過這個點的時候流量最大為1。
但是這樣很顯然是把問題複雜化了,因為只給出了人和房間,菜品的關係,所以我們可以考慮這樣建圖:
將房間和源點相連,菜品和匯點相連。
將人拆成兩個點限制流量。
這樣就可以比較簡單解決問題(當然如果全部拆點應該也能過)。
1 #include2using
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個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意 滿意的條...