二分图构图的特点是:先根据题意确定考察点,然后再判断构造的图模型是否是二分图,或者能否转换为二分图,然后根据划分关系是否明确来定性边有无方向。最后,用二分图匹配算法解决之。
1: HDU 过山车
http://acm.hdu.edu.cn/showproblem.php?pid=2063
分析:直观的二分图题,以男女为二分图的两部分建图即可;
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 #define N 505 5 int k, n, m; 6 bool partner[N][N], used[N]; 7 int match[N]; 8 9 bool find(int x) 10 { 11 for (int i=1; i<=n; i++) 12 { 13 if (!used[i] && partner[x][i]) 14 { 15 used[i] = true; 16 if (match[i]==-1 || find(match[i])) 17 { 18 match[i] = x; 19 return true; 20 } 21 } 22 } 23 return false; 24 } 25 26 void Hungary () 27 { 28 int cnt=0; 29 memset (match, -1, sizeof match); 30 for (int i=1; i<=m; i++) 31 { 32 memset (used, 0, sizeof used); 33 if (find(i)) 34 cnt++; 35 } 36 printf ("%d\n",cnt); 37 } 38 int main () 39 { 40 while (~scanf ("%d",&k) && k) 41 { 42 int a, b; 43 scanf ("%d%d",&m, &n); 44 memset (partner, 0, sizeof partner); 45 while (k--) 46 { 47 scanf("%d%d",&a, &b); 48 partner[a][b] = 1; 49 } 50 Hungary(); 51 } 52 return 0; 53 }