hdu2063 最大二分匹配(匈牙利演算法)
阿新 • • 發佈:2018-11-28
過山車
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 30799 Accepted Submission(s): 13289
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
#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 MBProblem 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