酒店之王解題報告

2022-06-19 18:33:17 字數 2256 閱讀 1322

1.網路流最大流(\(dinic\), \(edmonds-karp\)都可以)

2.建圖(鄰接鍊錶,反向邊^1的小技巧)

題目傳送門

簡單地闡述一下題意:

有 \(n\) 個 \(a\) 類節點,\(p\) 個 \(b\) 類節點, \(q\) 個 \(c\) 類節點。每個 \(a\) 與乙個 \(b\) 和乙個 \(c\) 構成一組匹配(每個\(a\)只能與給定的\(b\)、\(c\)匹配,且每個\(b\)、\(c\)只能匹配乙個\(a\)),求最大匹配數。

簡化之後的題意很像二分圖匹配,二分圖匹配是乙個點匹配乙個點,而本題是乙個點匹配兩個點。

起先,我是想將 \(a\) 類節點放在左邊,\(b\) 類節點放中, \(c\) 類最右。順著題意用\(a\)匹配\(b\)和\(c\)的,然後發現,這樣子根本無法建圖!!!

因為題目只給出了\(a\)——\(b\), \(a\)——\(c\)的關係,根本不知道\(b\)與\(c\)的關係。倘若按上面方式建圖的話,\(b\)和\(c\)就會成為並列的節點。很明顯這是不符合題意的。

那該如何建圖呢?

既然已經知道\(b\)與\(a\)的關係、\(a\)與\(c\)的關係,不妨直接將\(a\)放在中間,\(rt\):

如此,得到了一張三分圖,再求此圖的最大匹配即可。

從\(a\)出發直接向\(b\)和\(c\)跑兩次二分圖匹配即可。這裡不作詳細解釋。

按照網路流的正常操作,建立乙個超級源點\(s\),連線所有\(b\),流量為1; 建立乙個超級匯點\(t\), 使所有\(c\)都連向\(t\),流量為1。再根據題目所給的關係連線\(b\)——\(a\)、\(a\)——\(c\)。

可能很多同學看到這裡都會想:會了會了,然後再跑網路流最大流嘛。

不要以為這樣就可以了。這可是三分圖匹配呀,哪有那麼簡單!

看下面這幅圖你就會知道**錯了。

如果光是按上述方法建圖的話,那麼圖就會變成上面那樣,最大流跑出來是2。

然而我們知道,最大流不能是2,因為任意\(b\)、\(c\)只能匹配乙個\(a\)。

如何解決上述問題呢?

很簡單,只需要將\(a\)拆分為兩個點即可,\(rt\)。

連線\(a\)和\(a'\),流量為1。

即可避免多個\(b\)、\(c\)重複匹配乙個\(a\)的情況了。

終於可以上**了:(我太菜了,不會\(dinic\),所以只能寫\(e-k\)了)

#includeusing namespace std;

const int maxn = 105, maxm = 10000005, inf = 2147483647;

int head[maxn<<2], ver[maxm], edge[maxm], next[maxm], tot;

void add(int x,int y,int z)

int n, p, q;

//a:1~n, b:n+1~n+p, c:n+p+1~n+p+q, a':n+p+q+1~n+p+q+n

int s, t, maxflow, incf[maxn<<2], pre[maxn<<2];bool vis[maxn<<2];

bool bfs()

} return false;

}void update()

maxflow+=incf[t];

}int main()

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

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

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

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

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

while(bfs()) update();

printf("%d", maxflow);

return 0;

}

這道題是一道非常好的題目,它的建圖方式很新穎。

網路流的題目考的無非就是建圖,只要把圖建好了,還有什麼題搞不掂?

洛谷P1402 酒店之王 解題報告

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

Luogu P1402 酒店之王

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

P1402 酒店之王

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