记录编号 527273 评测结果 AAAAAAAAAAAA
题目名称 草地排水 最终得分 100
用户昵称 GravatarHale 是否通过 通过
代码语言 C++ 运行时间 0.046 s
提交时间 2019-02-12 21:49:05 内存使用 19.40 MiB
显示代码纯文本
  1. #include<queue>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. const int N=1001010;
  7. const int INF=1e9;
  8. int m,n,s,t,cnt=-1,head[N],ans,dep[N];
  9. struct edge
  10. { int to,nx,flow;} e[N];
  11. void add_edge(int u,int v,int w)
  12. { cnt++;
  13. e[cnt].to=v;
  14. e[cnt].flow=w;
  15. e[cnt].nx=head[u];
  16. head[u]=cnt;
  17. }
  18. bool bfs(int s,int t)
  19. { queue<int> que;
  20. memset(dep,0,sizeof(dep));
  21. dep[s]=1;que.push(s);
  22. while (!que.empty())
  23. { int x=que.front();que.pop();
  24. for (int i=head[x];i!=-1;i=e[i].nx)
  25. { int y=e[i].to;
  26. if (dep[y]==0&&e[i].flow>0)
  27. { dep[y]=dep[x]+1;
  28. que.push(y);
  29. }
  30. }
  31. }
  32. if (dep[t]>0) return true;
  33. else return false;
  34. }
  35. int dfs(int x,int limit,int t)
  36. { if (x==t) return limit;
  37. for (int i=head[x];i!=-1;i=e[i].nx)
  38. { int y=e[i].to;
  39. if (dep[y]==dep[x]+1&&e[i].flow>0)
  40. { int di=dfs(y,min(limit,e[i].flow),t);
  41. if (di>0)
  42. { e[i].flow-=di;
  43. e[i^1].flow+=di;
  44. return di;
  45. }
  46. }
  47. }
  48. return 0;
  49. }
  50. void dinic(int s,int t)
  51. { while (bfs(s,t)) ans+=dfs(s,INF,t);
  52. }
  53. int main()
  54. { freopen("ditch.in","r",stdin);
  55. freopen("ditch.out","w",stdout);
  56. scanf("%d%d",&m,&n);
  57. memset(head,-1,sizeof(head));
  58. for (int i=1;i<=m;i++)
  59. { int x,y,z;
  60. scanf("%d%d%d",&x,&y,&z);
  61. add_edge(x,y,z);
  62. add_edge(y,x,0);
  63. }
  64. dinic(1,n);
  65. printf("%d",ans);
  66. return 0;
  67. }