xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調、陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。
有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意(滿意的條件是住進喜歡的房間,吃到喜歡的菜)。
這裡要怎麼分配,能使最多顧客滿意呢?
輸入輸出格式
輸入格式:
第一行給出三個正整數表示n,p,q(<=100)。
之後n行,每行p個數包含0或1,第i個數表示喜不喜歡第i個房間(1表示喜歡,0表示不喜歡)。
之後n行,每行q個數,表示喜不喜歡第i道菜。
--最大的顧客滿意數。
輸入樣例1:
2 2 2
1 01 0
1 11 1
輸出樣例1:
~~這個其實是比較模板的題目了~~
首先想到了網路流,那麼最重要的就是建圖了,怎麼建圖呢?
因為 人 是連線 菜品 和 房間 的節點,所以我們把 人 放在中間,看不懂? 意思就是說把代表 人 的節點放在中間,把 菜品 和 房間 放在兩邊,按照題意連在 人 上,注意要把所有代表房間的點連在乙個起點和所有菜品連在終點,然後跑網路流模板。
然後。。。。你就會發現你只有60分,哈哈哈。
為什麼呢?因為僅僅這麼處理的話可能有乙個**過兩個房間,這樣顯然是不行的,乙個人只能對應乙個房間。那麼我們就需要把乙個人拆成兩個節點,兩節點之間最大流量為1,這樣子乙個人就只可能流過乙個房間了。
#includeusing namespace std;
struct node
e[200005];
int head[200005],cnt=1,be,en;
inline void add(int u,int v,int w)
bool vis[1000005];
int dis[1000005],nowh[1000005];
int n,p,q,t,s;
bool bfs()} }
return vis[t];
}int dfs(int be,int a)
}return flow;
}int dinic()
return flow;
}int main()
}for(int i=1;i<=n;i++)
}for(int i=1;i<=n;i++)//把人拆開
add(i+p,i+n+p,1);
for(int i=1;i<=p;i++)//把房間連在起點上
add(0,i,1);
for(int i=1;i<=q;i++)//把菜品接在終點上
add(i+n+p+n,n+n+p+q+1,1);
t=n+p+q+1+n;
s=0;
cout
}
洛谷 P1402 酒店之王
題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...
洛谷 P1402 酒店之王
題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...
洛谷P1402 酒店之王
洛谷連線 酒店之王 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所...