题目链接:
https://www.luogu.com.cn/problem/P1402
参考博客:
https://www.luogu.com.cn/blog/lhc/solution-p1402
算法:1:最大流FF算法
思路:
1:我们以房间、菜、人为点建图, 像这样:注意,以下出现的所有边边权皆为1,且其反向边边权为0
2:S(=0)表示额外建的一个起始点,Ri(=i + n + n)表示第i个房间,Di(=i+n+n+p)表示第i种菜,由于人只有一个,而网络流处理只经过一个点不方便,我们采用一种神奇方法——拆点,也就是说,把一个人看做两个点,要匹配这个人必须经过这个人两点之间的边,这样就可以控制这个人只匹配一次。如图,Pi(=i)、Pi'(=i+n)表示第i个人
3:然后建边,如图,将S与所有Ri相连,将所有的Di与T相连,S作为源点,T作为汇点。如果Pi喜欢Rj,就将Rj与Pi相连。如果Pi喜欢Dj,就将Pi'与Dj之间相连。当然,Pi与Pi'之间也要连一条边,然后就可以套网络最大流FF算法
拓展:
1:有一天来了n批客人,每批客人喜欢的菜、房间都相同。第i批客人有gi位客人。其余同原题
2:我们可以把每批客人当做2个点Pi、Pi',在Pi、Pi'之间连gi条边连一条权为gi的边即可。菜、房间每种有多个同理
特别注意:
1:这类题目如果要用网络最大流解决,一般来说,将“选择者”放中间,并且要拆点,“被选物”放两边,直接与源点、汇点相连。但是这种做法“被选物”不能多于两种
2:如果多于两种,要怎么做呢? 我也不知道