点击打开链接hdu2063
思路:二分图最大匹配
分析:
1 题目要求的是给定k条边,然后求出最大的能够匹配的边数
2 很明显的二分图的最大匹配,利用DFS匈牙利算法求出最大的匹配边数
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; #define MAXN 510 int Nx , Ny , k; int G[MAXN][MAXN]; int Mx[MAXN] , My[MAXN]; bool mark[MAXN]; bool FindPath(int u){ /*右边集里找到有关系的边并且未匹配过*/ for(int i = 1 ; i <= Ny ; i++){ if(G[u][i] && !mark[i]){ mark[i] = true; if(My[i] == -1 || FindPath(My[i])){/*找到"交错路"*/ My[i] = u; Mx[u] = i; return true; } } } return false; } int MaxMatch(){ int ans = 0; memset(Mx , -1 , sizeof(Mx)); memset(My , -1 , sizeof(My)); /*左边集找未匹配的点*/ for(int i = 1 ; i <= Nx ; i++){ if(Mx[i] == -1){/*未匹配的点是-1*/ memset(mark , 0 , sizeof(mark)); if(FindPath(i)) ans++; } } return ans; } int main(){ int a , b; while(scanf("%d" , &k) && k){ scanf("%d%d" , &Nx , &Ny); /*建模*/ memset(G , 0 , sizeof(G)); for(int i = 0 ; i < k ; i++){ scanf("%d%d" , &a , &b); G[a][b] = 1; } printf("%d\n" , MaxMatch()); } return 0; }