題目大意:有三個集合 \(p,q,n\),p 與 n 集合之間存在一些有向邊,n 與 q 集合之間存在一些有向邊。在三個集合中每個點最多只能利用一次的前提下,求最多能利用多少n 集合中的點,使得 \((p,n,q)\) 三個節點之間均有邊相連。
題解:若只有兩個集合,顯然是二分圖的最大匹配問題。對於三個集合來說,最麻煩的問題在於 n 集合中每個點只能被選一次,但是乙個 n 集合中的節點卻可能對應著多個p、q 集合中的節點。保證 n 只能被選一次的方法是:將 n 集合中的點拆分成兩個點,分別表示入點和出點,且連接入點和出點之間的邊權為 1。
**如下
#include using namespace std;
const int maxn=410;
const int maxm=1e5+10;
int n,p,q,s,t,maxflow,d[maxn];
struct nodee[maxm<<1];
int tot=1,head[maxn];
inline void add_edge(int from,int to,int w),head[from]=tot;
e[++tot]=node,head[to]=tot;
}bool bfs()}}
return 0;
}int dinic(int u,int flow)
}return flow-rest;
}void read_and_parse()
for(int i=1;i<=n;i++)
for(int j=1;j<=q;j++)
for(int i=2*n+1;i<=2*n+p;i++)add_edge(s,i,1);
for(int i=2*n+p+1;i<=2*n+p+q;i++)add_edge(i,t,1);
}void solve()
int main()
洛谷 P1402 酒店之王
題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...
洛谷 P1402 酒店之王
題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...
洛谷P1402 酒店之王
洛谷連線 酒店之王 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所...