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