1. 程式人生 > >P1402 酒店之王 網絡流

P1402 酒店之王 網絡流

class || clas 做出 ++i stream get cst algorithm

大水題,我自己瞎做就做出來了,沒啥說的,zz建圖,就是板子。

題幹:

題目描述

XX酒店的老板想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調、陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。

有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意(滿意的條件是住進喜歡的房間,吃到喜歡的菜)。

這裏要怎麽分配,能使最多顧客滿意呢?
輸入輸出格式
輸入格式:

第一行給出三個正整數表示n,p,q(<=100)。

之後n行,每行p個數包含0或1,第i個數表示喜不喜歡第i個房間(1表示喜歡,0表示不喜歡)。

之後n行,每行q個數,表示喜不喜歡第i道菜。

輸出格式:

最大的顧客滿意數。

代碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(register int i = a;i <= n;++i)
#define lv(i,a,n) for(register int i = a;i >= n;--i)
#define
clean(a) memset(a,0,sizeof(a)) const int INF = 1 << 30; typedef long long ll; typedef double db; template <class T> void read(T &x) { char c; bool op = 0; while(c = getchar(), c < 0 || c > 9) if(c == -) op = 1; x = c - 0; while(c = getchar(), c >=
0 && c <= 9) x = x * 10 + c - 0; if(op) x = -x; } template <class T> void write(T x) { if(x < 0) putchar(-), x = -x; if(x >= 10) write(x / 10); putchar(0 + x % 10); } const int N = 1e3 + 5; struct node { int l,r,nxt,w,oth; }a[N * 10]; int len = 0,lst[N]; void add(int x,int y,int w) { // cout<<x<<" "<<y<<" "<<w<<endl; int k1,k2; a[++len].l = x; a[len].r = y; a[len].w = w; a[len].nxt = lst[x]; lst[x] = len; k1 = len; a[++len].l = y; a[len].r = x; a[len].w = 0; a[len].nxt = lst[y]; lst[y] = len; k2 = len; a[k1].oth = k2; a[k2].oth = k1; } int n,p,q; int h[N],ed = 0; bool bfs() { clean(h); h[0] = 1; queue <int> q; q.push(0); while(!q.empty()) { int x = q.front(); q.pop(); for(int k = lst[x];k != -1;k = a[k].nxt) { int y = a[k].r; if(a[k].w > 0 && h[y] == 0) { h[y] = h[x] + 1; q.push(y); } } } if(h[ed] > 0) return true; else return false; } int find(int x,int f) { if(x == ed) { return f; } int s = 0,t; for(int k = lst[x];k != -1;k = a[k].nxt) { int y = a[k].r; if(s < f && h[y] == h[x] + 1 && a[k].w > 0) { t = find(y,min(a[k].w,f - s)); s += t; a[k].w -= t; a[a[k].oth].w += t; } } if(s == 0) h[x] = 0; return s; } int main() { read(n);read(p);read(q); memset(lst,-1,sizeof(lst)); duke(i,1,n) add(0,i,1); duke(i,1,n) { duke(j,1,p) { int x; read(x); if(x == 1) { add(j,p + i,1); } } } duke(i,1,n) { add(p + i,p + n + i,1); } duke(i,1,n) { duke(j,1,p) { int x; read(x); if(x == 1) { add(p + n + i,p + 2 * n + j,1); } } } ed = 2 * p + 2 * n + 1; duke(i,1,p) { add(p + 2 * n + i,ed,1); } int s = 0,t,l; while(bfs() == true) { s += find(0,INF); } printf("%d\n",s); return 0; }

P1402 酒店之王 網絡流