最大流,拆點,二分
考慮二分最大匹配次數
將每個人拆成2
22個點,乙個點為喜歡,乙個點為不喜歡,建立源點和匯點,源點向男生喜歡點連線,流量為當前二分值,女生喜歡點向匯點連線,流量為當前二分值。男生喜歡點向男生不喜歡點連線,流量為k
kk,女生不喜歡點向女生喜歡點連線,流量為k
kk.然後男生喜歡點向女生喜歡點連線,流量為1
11,不喜歡點同理.於是建圖就解決了,接著直接跑最大流即可,如果最後滿流了,那麼當前二分值就是合法的。
每次二分需要重新建圖,注意初始化。
#include
#define int long long
#define m 200009
using
namespace std;
const
int inf=
1e9;
int tot=
1,nxt[m*2]
,to[m*2]
,w[m*2]
,first[m]
,d[m]
,now[m]
,n,s,t,ans,k;
char s[
100]
[100];
intread()
for(
;isdigit
(ch)
;ch=
getchar()
) re=
(re<<3)
+(re<<1)
+ch-
'0';
return re*f;
}void
add(
int x,
int y,
int z)
bool
bfs()}
}return0;
}int
dinic
(int x,
int flow)
}now[x]
=i;return flow-rest;
}bool
check
(int mid)
for(
int i=
1;i<=n;i++
)add
(i,i+
2*n,k)
,add
(i+3
*n,i+n,k)
,add
(s,i,mid)
,add
(i+n,t,mid)
;//printf("%lld\n,tot);
while
(bfs()
)if(flow=
dinic
(s,inf)
) ans+
=flow;
//printf("%lld\n",ans);
if(ans==n*mid)
return
true
;else
return
false;}
signed
main()
printf
("%lld\n"
,l);
return0;
}
poj 2112 最大流 二分
題意 有k臺擠奶機,c頭奶牛,給出這k c個實體間的距離,求出每頭奶牛都到一台擠奶機去,怎麼分配使奶牛走的最大距離最小。用二分列舉最大距離,include include define n 500 define inf 0x3fffffff int map n n dis n gap n head ...
hdu 3228 最大流 二分
題意 一共有n個城市,一些城市裡有金礦,一些城市裡有倉庫,金礦和倉庫都有乙個容量,有m條邊,每條邊是雙向的,有乙個權值,求將所有金礦裡的儲量都運送到倉庫中,所需要經過的道路中,使最大的權值最小 思路 增設乙個超級源點和乙個超級匯點,源點與每乙個城市相連,容量為 數量,匯點與倉庫相連,容量為倉庫的容量...
poj 2391 二分 最大流
思路 求最短時間,可以想到二分,然後判斷可行性。首先在原圖上求 floyd,得到每兩個棚之間的最短距離。然後拆點 將每個棚拆為 i 和 i 流進和流出 添邊 i,i inf 增加源點 s 和匯點 t,從 s 連邊到 i,容量為該棚現在的貓的數量,i 連邊到 t,容量為該棚的容量。若棚 i 和棚 j ...