luogu1402 酒店之王 最大流

2021-08-20 19:45:25 字數 1430 閱讀 6101

好像只有菜或者房間的情況就是最大二分圖匹配,但是這裡有三種點,每種點都只可以選一次,且三個點都要對應才可以算得上是一種匹配。

考慮最大流建模,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個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...