过山车

http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车

使用匈牙利算法求解

  
  
  
  
  1. #include<stdio.h>  
  2. #include<string.h>  
  3. int adj_vex[501][501];  
  4. int match[501];  
  5. int flag[501];  
  6.  
  7. int find(int v, int n)  
  8. {  
  9.     int i;  
  10.     for (i = 1; i <= n; i++)  
  11.     {  
  12.         if (adj_vex[v][i] == 1 && flag[i] == 0)  
  13.         {  
  14.             flag[i] = 1;  
  15.             if (match[i] == 0 || find(match[i], n) == 1)  
  16.             {  
  17.                 match[i] = v;  
  18.                 return 1;  
  19.             }  
  20.         }  
  21.     }  
  22.     return 0;  
  23. }  
  24.  
  25. void main()  
  26. {  
  27.     int k, m, n;  
  28.     int i, j, male, female;  
  29.     int count;  
  30. //    freopen("input.txt", "r", stdin);  
  31.     while (scanf("%d", &k) != EOF && k != 0)  
  32.     {  
  33.         scanf("%d%d", &m, &n);  
  34.         for (i = 1; i <= m; i++)  
  35.         {  
  36.             for (j = 1; j <= n; j++)  
  37.             {  
  38.                 adj_vex[i][j] = 0;  
  39.             }  
  40.         }  
  41.  
  42.         for (i = 1; i <= k; i++)  
  43.         {  
  44.             scanf("%d%d", &male, &female);  
  45.             adj_vex[male][female] = 1;  
  46.         }  
  47.         count = 0;  
  48.         memset(match, 0, (n + 1)*sizeof(int));  
  49.         for (i = 1; i <= m; i++)  
  50.         {  
  51.             memset(flag, 0, (n + 1)*sizeof(int));  
  52.             if (find(i, n) == 1)  
  53.                 count++;  
  54.         }  
  55.         printf("%d\n",count);  
  56.     }  
  57. }  

 

你可能感兴趣的:(职场,ACM,休闲)