usaco 4.2 The Perfect Stall 二分图最大匹配

 这里采用网络流方法解决,建立虚拟源点src,从src到每头牛添边,建立虚拟汇点des,从每个摊点向des添边,每条边的权值都是1,求从src到des的最大流即可

 

 

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <string>
  4. #include <map>
  5. using namespace std;
  6. /*
  7. PROG: stall4
  8. LANG: C++
  9. ID: heben991
  10. */
  11. const int N = 420, INF = 2000000000, MaxFlow = 10000000;
  12. int g[N][N], flow[N][N];
  13. int n, cow, stall;
  14. int inc[N], q[N], pre[N];
  15. bool bfs(int src, int des)
  16. {
  17.     int fp, rp, i, j, u;
  18.     for(i = 0; i <= n; ++i) pre[i]=-1;
  19.     inc[src] = INF;
  20.     q[fp=rp=0] = src;
  21.     while(fp<=rp)
  22.     {
  23.         u = q[fp++];
  24.         for(i = 0; i <= n; ++i)
  25.         if(pre[i]==-1 && flow[u][i] < g[u][i])
  26.         {
  27.             inc[i] = min(inc[u], g[u][i]-flow[u][i]);
  28.             pre[i] = u;
  29.             if(i==des) return true;
  30.             q[++rp] = i;
  31.         }
  32.     }
  33.     return false;
  34. }
  35. int Edmonds_Karp(int src, int des)
  36. {
  37.     int i, j, maxflow=0;
  38.     while(bfs(src,des))
  39.     {
  40.         for(i = des; i != src; i = pre[i])
  41.         {
  42.             j = pre[i];
  43.             flow[j][i] += inc[i];
  44.             flow[i][j] = -flow[j][i];
  45.         }
  46.         maxflow += inc[des];
  47.     }
  48.     return maxflow;
  49. }
  50. int main()
  51. {
  52.     int i, j, k, x, y;
  53.     freopen("stall4.in""r", stdin);
  54.     freopen("stall4.out","w",stdout);
  55.     scanf("%d%d", &cow, &stall);
  56.     for(i = 1; i <= cow; ++i)
  57.     {
  58.         scanf("%d", &x);
  59.         for(j = 1; j <= x; ++j)
  60.         {
  61.             scanf("%d", &y);
  62.             g[i][y+cow] = 1;
  63.         }
  64.     }
  65.     for(i = 1; i <= cow; ++i) g[0][i] = 1;
  66.     n = cow+stall+1;
  67.     for(i = cow+1; i < n; ++i) g[i][n] = 1;
  68.     printf("%d/n", Edmonds_Karp(0,n) );
  69.     return 0;
  70. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值