當初以為網路流是金牌題,從來都沒接觸過,後來才知道原來網路流只是乙個模板,真正難的是構圖問題,而且如果一眼看出是模板題的話只要能構出來圖問題就不大,大家的dinic模板都差不多。來一道簡單的構圖問題吧。
description
一次舞會有n個男孩和n個女孩。每首曲子開始時,所有男孩和女孩恰好配成n對跳交誼舞。每個男孩都不會和同乙個女孩跳兩首(或更多)舞曲。有一些男孩女孩相互喜歡,而其他相互不喜歡(不會「單向喜歡」)。每個男孩最多隻願意和k個不喜歡的女孩跳舞,而每個女孩也最多隻願意和k個不喜歡的男孩跳舞。給出每對男孩女孩是否相互喜歡的資訊,舞會最多能有幾首舞曲?
input
第一行包含兩個整數n和k。以下n行每行包含n個字元,其中第i行第j個字元為』y』當且僅當男孩i和女孩j相互喜歡。
output
僅乙個數,即舞曲數目的最大值。
sample input
3 0yyy
yyyyyy
sample output
3建乙個s,t。s連線每個男孩,t連線每個女孩。每個男孩有兩個點,喜歡和不喜歡,女孩也有兩個點,喜歡和不喜歡,喜歡的點連線喜歡的點,不喜歡的點連線不喜歡的點,從源點出來的點的權值為答案,每個人和自己喜歡的屬性點之間的權值為答案,和自己不喜歡的屬性點之間的權值為k,然後和自己喜歡或不喜歡的人之間的權值為1。二分答案跑dinic就行
#include
using
namespace
std;
const
int inf=0x3f3f3f3f;
const
int maxn=1e5+5;
int head[maxn],ver[maxn],edge[maxn],next[maxn],d[maxn];
int n,k,s,t,tot,maxflow;
queue
q;void add(int x,int y,int z)
bool bfs() }}
return0;}
int dinic(int x,int flow)
}return flow-rest;
}char node[100][100];
void build(int mid)
int main()
}int l=0,r=50,ans=0;
while(lint mid=(l+r)/2;
build(mid);
int flow=0;maxflow=0;
while(bfs())
if(maxflow>=n*mid) ans=mid,l=mid+1;
else r=mid;
}cout
0;}
BZOJ1305 網路流最大流
bzoj1305 網路流最大流 分析 建立源點和匯點,將男孩分為喜歡點和不喜歡點,每個男孩喜歡點跟源點連線,權值為要求的答案,女孩跟匯點連線,權值為要求的答案 男孩的喜歡點和男孩的不喜歡點鏈結,權值為k,女孩的喜歡點和女孩的不喜歡點鏈結,權值為k 男孩跟喜歡的女孩連線,權值為1,同樣男孩不喜歡的女孩...
BZOJ 1305 二分 網路流
思路 建圖我根本沒有想到啊 我是不會告訴你我借鑑了一下題解的思路 把每個人拆成喜歡的和不喜歡的點 男 喜歡 向 男 不喜歡 連 邊權為k的邊 如果男喜歡女 那麼 男喜歡向 女喜歡 連 1 如果男 不喜歡女 那麼 男不喜歡 向 女不喜歡 連1 男 喜歡 向 男不喜歡 連k 女 不喜歡 向 女喜歡 連k...
網路流入門
網路流的最經典應用就是最大流.給定乙個圖.給出每條邊能流過的最大流量.求源點到匯點的最大流量.求解網路流的基本思想就是每次尋找增廣路 就是源點到匯點的一條可行路 然後ans 增廣路能流過的流量.更新剩餘網路.然後再做增廣路.直到做不出增廣路.關於網路流入門最難理解的地方就是剩餘網路了.為什麼在找到一...