luogu P1402 酒店之王 網路流最大匹配

2022-03-09 17:17:42 字數 1219 閱讀 2046

題目描述

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

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

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

輸入格式

第一行給出三個整數,分別表示表示 \(n,p,q\)。

之後 \(n\) 行,每行 \(p\) 個整數,只可能是 \(0\) 或 \(1\),第 \(i\) 行第 \(j\) 個數表示第 \(i\) 個人喜不喜歡第 \(j\) 個房間(\(1\) 表示喜歡, \(0\) 表示不喜歡)。

之後 \(n\) 行,每行 \(q\) 個整數,只可能是 \(0\) 或 \(1\),第 \(i\) 行第 \(j\) 個數表示第 \(i\) 個人喜不喜歡第 \(j\) 道菜(\(1\) 表示喜歡, \(0\) 表示不喜歡)。

輸出格式

最大的顧客滿意數。

#include#include#include#includeusing namespace std;

const int n=5e4+5,m=1e6+5,inf=1<<30;

int nxt[m],head[n],go[m],edge[m],tot=1;

inline void add(int u,int v,int w)

int n,p,q,now[n];

int s,t,d[n],maxflow;

bool bfs()}}

return 0;

}int dinic(int u,int flow)}}

return 0;

}signed main()

for(int i=1;i<=n;i++)add(i+p,i+p+n,1);

for(int i=1,x;i<=n;i++)

for(int j=1;j<=q;j++)

for(int j=1;j<=q;j++)add(p+n+n+j,t,1);

int flow=0;

while(bfs())

while(flow=dinic(s,inf))maxflow+=flow;

cout<}

Luogu P1402 酒店之王

luogu 型別 網路最大流 建模分析 首先,我們要拆人,卻不能拆房間和菜,因為給我們的關係是人與房間和人與菜的關係,我們只能用人當做中間橋梁聯絡房間與菜。那麼思路就很清晰明了了。源點向每個房間連一條容量為1的邊 喜歡的房間向人的入點連一條容量為1的邊 人的入點向出點連一條容量為1的邊 人的出點向喜...

luogu P1402 酒店之王

酒店之王 先大致講一下題意 題目給定p道菜,q個房間和n個客人。每個客人滿意的條件當且僅當那個客人分配到的房間和菜都是自己喜歡的。想都不想直接網路流,裸題。但是因為沒看清題意一開始瘋狂30分 模型 這樣子只要跑一邊網路流求出最大流就行了。感覺沒有紫題難度 include using namespac...

luoguP1402 酒店之王(網路流)

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