匈牙利演算法 hdu 2063(過山車)
阿新 • • 發佈:2019-01-30
二分圖匹配,解決配對問題。
eg:過山車
Problem Description RPG girls今天和大家一起去遊樂場玩,終於可以坐上夢寐以求的過山車了。可是,過山車的每一排只有兩個座位,而且還有條不成文的規矩,就是每個女生必須找個個男生做partner和她同坐。但是,每個女孩都有各自的想法,舉個例子把,Rabbit只願意和XHD或PQK做partner,Grass只願意和linle或LL做partner,PrincessSnow願意和水域浪子或偽酷兒做partner。考慮到經費問題,boss劉決定只讓找到partner的人去坐過山車,其他的人,嘿嘿,就站在下面看著吧。聰明的Acmer,你可以幫忙算算最多有多少對組合可以坐上過山車嗎? Input 輸入資料的第一行是三個整數K , M , N,分別表示可能的組合數目,女生的人數,男生的人數。0<K<=10001<=N 和M<=500.接下來的K行,每行有兩個數,分別表示女生Ai願意和男生Bj做partner。最後一個0結束輸入。 Output 對於每組資料,輸出一個整數,表示可以坐上過山車的最多組合數。 Sample Input 6 3 3 1 1 1 2 1 3 2 1 2 3 3 1 0 Sample Output 3
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int n,m; int match[1010][1010],vis[1010]; int g[1010]; int gi,b; int find(int x){ int i,j; for (i=1;i<=n;i++){ if (!vis[i] && match[x][i]){ vis[i]=1; if (!g[i] || find(g[i])){ g[i]=x; return 1; } } } return 0; } int main(){ int k,i,sum; while (scanf ("%d", &k)&&k){ sum=0; memset (match,0,sizeof(match)); memset (g,0,sizeof(g)); scanf ("%d %d", &n, &m); for (i= 1; i<= k; i++){ scanf ("%d %d", &gi, &b); match[b][gi]=1; } for (i=1;i<=m;i++){ memset (vis,0,sizeof(vis)); if (find(i)) sum++; } printf ("%d\n",sum); } return 0; }