P3153跳舞 二分,最大流

2021-10-05 03:32:32 字數 1662 閱讀 3495

最大流,拆點,二分

考慮二分最大匹配次數

將每個人拆成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 ...