xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調、陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。
有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意(滿意的條件是住進喜歡的房間,吃到喜歡的菜)。
這裡要怎麼分配,能使最多顧客滿意呢?
第一行給出三個正整數表示n,p,q(<=100)。
之後n行,每行p個數包含0或1,第i個數表示喜不喜歡第i個房間(1表示喜歡,0表示不喜歡)。
之後n行,每行q個數,表示喜不喜歡第i道菜。
最大的顧客滿意數。
2 2 2
1 01 0
1 11 1
1
網路最大流。這裡不詳細講,請大家先掌握。
注意,以下出現的所有邊邊權皆為1,且其反向邊邊權為0我們以房間、菜、人為點建圖。
像這樣:
s(=0)表示額外建的乙個起始點,ri(=i + n + n)表示第i個房間,di(=i+n+n+p)表示第i種菜,由於人只有乙個,而網路流處理只經過乙個點不方便,我們採用一種神奇方法——拆點!也就是說,把乙個人看做兩個點,要匹配這個人必須經過這個人兩點之間的邊,這樣就可以控制這個人只匹配一次。如圖,pi(=i)、pi'(=i+n)表示第i個人。
然後建邊。如圖,將s與所有ri相連,將所有的di與t相連,s作為源點,t作為匯點。如果pi喜歡rj,就將pi與rj相連。如果pi喜歡dj,就將dj與pi'之間相連。當然,pi與pi'之間也要連一條邊。
然後就可以套網路最大流辣。最後得出的答案即為滿意數。
有一天來了n批客人,每批客人喜歡的菜、房間都相同。第i批客人有gi位客人。其餘同原題。
hint:我們可以把每批客人當做2個點pi、pi',在pi、pi'之間連gi條邊連一條權為gi的邊即可。菜、房間每種有多個同理。
#includeusing namespace std;
#define open(s) freopen( s".in", "r", stdin ), freopen( s".out", "w", stdout )
#define maxn 405
#define maxm 40005
int n, p, q;
int hd[maxn], nxt[maxm << 1], to[maxm << 1], val[maxm << 1], tot(1);
int ans, dis[maxn];
queueq;
int x, y;
int s, t;
void add( int x, int y, int z )
bool bfs()
} return 0;
}int dfs( int x, int fl )
} return fl - res;
}int main()
for ( int i = 1; i <= n; ++i )
for ( int j = 1; j <= q; ++j )
int t;
while( bfs() )
while( ( t = dfs( s, 0x7f7f7f7f ) ) > 0 ) ans += t;
printf( "%d\n", ans );
return 0;
}
這類題目如果要用網路最大流解決,一般來說,將「選擇者」放中間,並且要拆點,「被選物」放兩邊,直接與源點、匯點相連。但是這種做法「被選物」不能多於兩種。
如果多於兩種,要怎麼做呢? 我也不知道 qaq)求教大佬qaq
洛谷 P1402 酒店之王
題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...
洛谷 P1402 酒店之王
題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...
洛谷P1402 酒店之王
洛谷連線 酒店之王 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所...