1. 程式人生 > >二分圖最大匹配問題之網路流演算法

二分圖最大匹配問題之網路流演算法

實質:把多源,多匯網路,構造成單源單匯網路,同時置所有邊的容量為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));
}