记录编号 325733 评测结果 AAAAAAAAA
题目名称 [USACO 4.2] 完美的牛栏 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 C++ 运行时间 0.018 s
提交时间 2016-10-20 11:10:03 内存使用 0.27 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <string>
  5. #include <list>
  6. #include <vector>
  7. #include <queue>
  8. #include <map>
  9. using namespace std;
  10. #define MAXN 402
  11. class dinic
  12. {
  13. private:
  14. bool vis[MAXN];
  15. int dist[MAXN];
  16. int cure[MAXN];
  17. vector<int> G[MAXN];
  18. struct edge
  19. {
  20. int from, to, rem;
  21. };
  22. int s, t;
  23. vector<edge> edges;
  24. public:
  25. dinic(int fr, int to)
  26. {
  27. s = fr;
  28. t = to;
  29. }
  30. void addedge(int u, int v, int c)
  31. {
  32. edges.push_back((edge){u, v, c});
  33. edges.push_back((edge){v, u, 0});
  34. int k = edges.size();
  35. G[u].push_back(k-2);
  36. G[v].push_back(k-1);
  37. }
  38. bool bfs()
  39. {
  40. memset(vis, 0, sizeof(vis));
  41. queue<int> q;
  42. q.push(s);
  43. vis[s] = true;
  44. dist[s] = 0;
  45. while(q.size())
  46. {
  47. int c = q.front();
  48. q.pop();
  49. for(int i = 0; i < G[c].size(); i++)
  50. {
  51. edge &e = edges[G[c][i]];
  52. if(!vis[e.to] && e.rem > 0)
  53. {
  54. vis[e.to] = true;
  55. dist[e.to] = dist[c] + 1;
  56. q.push(e.to);
  57. }
  58. }
  59. }
  60. return vis[t];
  61. }
  62. int dfs(int x, int f)
  63. {
  64. if(f == 0 || x == t)return f;
  65. int tot = 0;
  66. int nt;
  67. for(int &i = cure[x]; i < G[x].size(); i++)
  68. {
  69. edge &e = edges[G[x][i]];
  70. if(dist[e.to] == dist[x] + 1 && (nt = dfs(e.to, min(f, e.rem))) > 0)
  71. {
  72. f -= nt;
  73. tot += nt;
  74. e.rem -= nt;
  75. edges[G[x][i]^1].rem += nt;
  76. if(f == 0)break;
  77. }
  78. }
  79. return tot;
  80. }
  81. int maxf()
  82. {
  83. int f = 0;
  84. while(bfs())
  85. {
  86. memset(cure, 0, sizeof(cure));
  87. f += dfs(s, 0x7fffffff);
  88. }
  89. return f;
  90. }
  91. };
  92.  
  93. int main()
  94. {
  95. freopen("stall4.in", "r", stdin);
  96. freopen("stall4.out", "w", stdout);
  97. int n, m;
  98. scanf("%d %d", &n, &m);
  99. dinic d(0, n+m+1);
  100. for(int i = 1; i <= n; i++)
  101. {
  102. int k, t;
  103. scanf("%d", &k);
  104. while(k--)
  105. {
  106. scanf("%d", &t);
  107. d.addedge(i, n+t, 1);
  108. }
  109. }
  110. for(int i = 1; i <= n; i++)
  111. d.addedge(0, i, 1);
  112. for(int i = 1; i <= m; i++)
  113. d.addedge(n+i, n+m+1, 1);
  114. printf("%d\n", d.maxf());
  115. return 0;
  116. }