记录编号 142853 评测结果 WWWWWWWWWW
题目名称 [网络流24题] 试题库 最终得分 0
用户昵称 GravatarSasuke 是否通过 未通过
代码语言 C++ 运行时间 0.006 s
提交时间 2014-12-11 11:33:31 内存使用 3.07 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. const int Sz = 1e5, Inf = 1<<30;
  8.  
  9. struct Edge {
  10. int v, Next, f, c;
  11. Edge() {}
  12. Edge(int v, int n, int f, int c): v(v), Next(n), f(f), c(c) {}
  13. } e[Sz];
  14. int head[Sz], cnt = 1;
  15.  
  16. void AddEdge(int u, int v, int c) {
  17. e[++cnt] = Edge(v, head[u], 0, c); head[u] = cnt;
  18. e[++cnt] = Edge(u, head[v], 0, c); head[v] = cnt;
  19. }
  20.  
  21. bool vis[Sz];
  22. int s, t, dis[Sz], cur[Sz];
  23. queue <int> q;
  24.  
  25. bool BFS() {
  26. memset(vis, 0, sizeof vis);
  27. q.push(s); vis[s] = 1; dis[s] = 0;
  28. while (!q.empty()) {
  29. int u = q.front(); q.pop();
  30. for(int E = head[u], v; E; E = e[E].Next)
  31. if (!vis[v = e[E].v] && e[E].c > e[E].f)
  32. q.push(v), vis[v] = 1, dis[v] = dis[u]+1;
  33. }
  34. return vis[t];
  35. }
  36.  
  37. int DFS(int o, int a) {
  38. if (o == t || !a) return a;
  39. int flow = 0, f;
  40. for(int& i = cur[o]; i; i = e[i].Next) {
  41. Edge& E = e[i];
  42. if (dis[E.v] == dis[o]+1 && (f = DFS(E.v, min(a, E.c-E.f))) > 0) {
  43. E.f += f; e[i^1].f -= f; flow += f; a -= f;
  44. if (!a) break;
  45. }
  46. }
  47. return flow;
  48. }
  49.  
  50. int flow, k, n, m;
  51. int Dinic() {
  52. while (BFS()) {
  53. for(int i = s; i <= t; ++i) cur[i] = head[i];
  54. flow += DFS(s, Inf);
  55. }
  56. return flow;
  57. }
  58.  
  59. int main() {
  60. freopen("testlib.in", "r", stdin);
  61. freopen("testlib.out", "w", stdout);
  62. scanf("%d %d", &k, &n);
  63. s = 0; t = n+k+1;
  64. for(int i = 1; i <= n; ++i) AddEdge(s, i, 1);
  65. for(int i = 1, c; i <= k; ++i)
  66. scanf("%d", &c), AddEdge(n+i, t, c), m += c;
  67. for(int i = 1,j, p,c; i <= n; ++i)
  68. for(scanf("%d", &p), j = 0; j < p; ++j)
  69. scanf("%d", &c), AddEdge(i, n+c, 1);
  70. if (Dinic() < m) { puts("NoSolution!"); return 0;}
  71. for(int i = 1; i <= k; ++i) {
  72. printf("%d: ", i);
  73. for(int E = head[n+i]; E; E = e[E].Next)
  74. if (e[E].f < 0) printf("%d ", e[E].v);
  75. puts("");
  76. }
  77. }
  78.