二分圖最大匹配問題之網路流演算法
阿新 • • 發佈:2018-12-31
實質:把多源,多匯網路,構造成單源單匯網路,同時置所有邊的容量為1。
操作:(G=(X∪Y,E))
(1)增加一個源點s和一個匯點t;
(2)從s向集合X的每一個頂點引一條有向邊,從集合Y的每一個頂點向t引一條有向邊;
(3)將原圖的每條邊改為從集合X向集合Y的有向邊;
(4)置每條邊的容量為1;
程式碼中的函式參見最大流模板點選開啟連結
程式碼:
//輸入 int N,K;//N代表集合X的數目,K代表集合Y的數目 bool can[max_n][max_k];//集合X和集合Y的聯絡 void solve() { //0~N-1:X中元素的序號 //N~N+K-1:Y中元素的序號 int s=N+K,t=s+1;//新增源點和匯點 //源點向集合X連邊 for(int i=0;i<N;i++) add_edge(s,i,1); //集合Y向匯點連邊 for(int i=0;i<K;i++) add_edge(N+i,t,1); //集合X向集合Y連邊 for(int i=0;i<N;i++) for(int j=0;j<K;j++) if(can[i][j]) add_edge(i,N+j,1); printf("%d\n",max_flow(s,t)); }