1. 程式人生 > 實用技巧 >hdu2063 過山車(二分圖基礎)

hdu2063 過山車(二分圖基礎)

過山車

Problem Description RPG girls今天和大家一起去遊樂場玩,終於可以坐上夢寐以求的過山車了。可是,過山車的每一排只有兩個座位,而且還有條不成文的規矩,就是每個女生必須找個個男生做partner和她同坐。但是,每個女孩都有各自的想法,舉個例子把,Rabbit只願意和XHD或PQK做partner,Grass只願意和linle或LL做partner,PrincessSnow願意和水域浪子或偽酷兒做partner。考慮到經費問題,boss劉決定只讓找到partner的人去坐過山車,其他的人,嘿嘿,就站在下面看著吧。聰明的Acmer,你可以幫忙算算最多有多少對組合可以坐上過山車嗎? Input 輸入資料的第一行是三個整數K , M , N,分別表示可能的組合數目,女生的人數,男生的人數。0<K<=1000
1<=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

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 const int maxn=510;
 6 int mp[maxn][maxn];
 7 int vis[maxn];
 8 int pri[maxn];
 9 int k,m,n;
10 bool find(int x)//核心程式碼
11 {
12     for(int i=1;i<=m;i++)
13     {
14         if(vis[i]==0&&mp[i][x])
15 { 16 vis[i]=1; 17 if(pri[i]==-1||find(pri[i])) 18 { 19 pri[i]=x; 20 return true; 21 } 22 } 23 } 24 return false; 25 } 26 int main() 27 { 28 while(scanf("%d%",&k),k) 29 { 30 scanf("
%d%d",&m,&n); 31 memset(mp,0,sizeof(mp)); 32 memset(pri,-1,sizeof(pri)); 33 int a,b; 34 for(int i=1;i<=k;i++) 35 { 36 scanf("%d%d",&a,&b); 37 mp[a][b]=1; 38 } 39 int ans=0; 40 for(int i=1;i<=n;i++) 41 { 42 memset(vis,0,sizeof(vis)); 43 if(find(i)) 44 ans++; 45 } 46 printf("%d\n",ans); 47 } 48 return 0; 49 }