1. 程式人生 > >hdu2063 最大二分匹配(匈牙利演算法)

hdu2063 最大二分匹配(匈牙利演算法)

過山車

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 30799    Accepted Submission(s): 13289


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 匈牙利演算法詳解: https://blog.csdn.net/dark_scope/article/details/8880547
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=505;
int line[N][N];
int girl[N],used[N];
int k,m,n; bool found(int x) { for(int i=1; i<=n; i++) { if(line[x][i]&&!used[i])//x與i之間是否有連線,並且男生i沒有被匹配過(第一個女生與她聯絡的第一個男生配對) { used[i]=1;//標記男生i被匹配過 if(girl[i]==0||found(girl[i]))//第i個女生還沒有匹配或者第I個女生匹配了就回溯 {//先讓I女生和X男匹配,再讓I-1女生和與她聯絡的第二個男生匹配 girl[i]=x; return 1; } } } return 0; } int main() { int x,y; while(scanf("%d",&k)&&k) { scanf("%d %d",&m,&n); memset(line,0,sizeof(line)); memset(girl,0,sizeof(girl)); for(int i=0; i<k; i++) { scanf("%d %d",&x,&y); line[x][y]=1; } int sum=0; for(int i=1; i<=m; i++) { memset(used,0,sizeof(used)); if(found(i)) sum++; } printf("%d\n",sum); } return 0; }

 相似題目:

     E: DATE ALIVE

Time Limit: 1 s      Memory Limit: 128 MB       

Problem Description

五河士道家裡的精靈越來越多了,而每一個精靈都想和他有一個約會。然而五河士道卻只有一個,無奈之下只能使出分身幫自己解圍。

不過並不是所有的精靈都同意這樣做,有些精靈不願意和士道分身進行約會,也有部分精靈同時選擇同一個分身進行約會。

假設有N個分身,精靈的數量為M,可能的約會組合有K組。

設N=3,M=5,K=5,可能的組合為1-1,1-3,2-4,3-4,3-5(如下圖),為了避免衝突,我們最多可以選擇1-1,2-4,3-5一共三種組合(或者是1-3,2-4,3-5)

那麼請設計一個程式判斷每一次可能的組隊最多能確定多少隊伍?最後,讓我們的約會開始吧~

 

 

 

Input

輸入N,M,K

N,M,K為正整數

1<=N<=500

1<=M<=500

接下來K行,輸入u,v,表示uv之間願意組隊

u在N的範圍內,v在M的範圍內

Output

輸出最大組隊數目

Sample Input

3 5 5
1 1
1 3
2 4
3 4
3 5

Sample Output

3