好像只有菜或者房間的情況就是最大二分圖匹配,但是這裡有三種點,每種點都只可以選一次,且三個點都要對應才可以算得上是一種匹配。
考慮最大流建模,1的流量要流過三個對應的點才代表是一種匹配,我們可以依次從菜->人->房間連邊,菜和房間單獨向源點和匯點連邊,但是這樣發現會有問題,即我們限制不了中間的人的點的流量。乙個好的辦法就是將乙個人拆成一條流量為1邊的兩端的兩個點,流經乙個人就相當於流經這一條邊,這樣就通過將點化為邊的形式滿足了題目的限制。
/**************************=
* ahthor : ylsoi
* problem : luogu 1402
* algorithm : dinic
* time : 2018.6.18
* ********************====*/
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
void file()
template
bool chkmax(t &_,t __)
template
bool chkmin(t &_,t __)
#define rep(i,a,b) for(register int i=a;i<=b;++i)
#define drep(i,a,b) for(register int i=a;i>=b;--i)
#define mrep(i,x) for(register int i=beg[x];i;i=e[i].last)
#define mem(a) memset(a,0,sizeof(a))
#define ll long long
#define inf int_max
const
int maxn=100+10;
int n,p,q,beg[maxn*5],cnte=1,ss,tt;
struct edgee[maxn*maxn*5];
void add(int u,int v,int flow)
void init()
rep(i,1,n)rep(j,1,q)
rep(i,1,n)
rep(i,1,p)
rep(i,1,q)
}namespace dinic
}return
false;
}int dfs(int u,int gap)
if(!gap)break;
}return sum;
}void work()
printf("%d\n",ans);
}}int main()
Luogu P1402 酒店之王
luogu 型別 網路最大流 建模分析 首先,我們要拆人,卻不能拆房間和菜,因為給我們的關係是人與房間和人與菜的關係,我們只能用人當做中間橋梁聯絡房間與菜。那麼思路就很清晰明了了。源點向每個房間連一條容量為1的邊 喜歡的房間向人的入點連一條容量為1的邊 人的入點向出點連一條容量為1的邊 人的出點向喜...
P1402 酒店之王
xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意 滿意的條...
P1402 酒店之王
題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...