题意 男女匹配,最多组合数
题解 匈牙利算法
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<stdio.h> 2 #include<string.h> 3 #define N 1000 4 int map[N][N],visit[N],mark[N]; 5 int k,n,m; 6 7 bool dfs(int u)//寻找从u出发的对应项出的可增广路 8 { 9 for(int i=1;i<=n;i++)//(从邻接表中列举u能关联到顶点j) 10 { 11 if(map[u][i]&&!visit[i])//i不在增广路上 12 { 13 visit[i]=true;//把i加入增广路 14 if(!mark[i]||dfs(mark[i]))//i是未盖点或从i的对应项出发有可增广路 15 { 16 mark[i]=u;//修改i的对应项为u 17 return true;//则从u的对应项出有可增广路,返回true 18 } 19 } 20 } 21 return false;//则从u的对应项出没有有可增广路,返回false 22 } 23 24 int main() 25 { 26 int i,j,a,b; 27 while(~scanf("%d",&k)&&k) 28 { 29 scanf("%d %d",&m,&n); 30 for(i=1;i<=m;i++) 31 for(j=1;j<=n;j++) 32 map[i][j]=false; 33 for(i=1;i<=k;i++) 34 { 35 scanf("%d %d",&a,&b); 36 map[a][b]=true; 37 } 38 int ans=0; 39 memset(mark,0,sizeof(mark)); 40 for(i=1;i<=m;i++) 41 { 42 memset(visit,0,sizeof(visit)); 43 if(dfs(i)) 44 ans++;//匹配数++ 45 } 46 printf("%d ",ans); 47 } 48 return 0; 49 }