记录编号 430270 评测结果 AAAAAAAAAAAA
题目名称 草地排水 最终得分 100
用户昵称 GravatarHallmeow 是否通过 通过
代码语言 C++ 运行时间 0.009 s
提交时间 2017-07-29 16:19:26 内存使用 1.08 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<queue>
  4. #include<iostream>
  5. #include<cstring>
  6. using namespace std;
  7. #define LL long long
  8. #define pos(i,a,b) for(LL i=(a);i<=(b);i++)
  9. #define N 40100
  10. const int inf=0x7fffffff;
  11. struct haha{
  12. int next,to,w;
  13. }edge[N];
  14. int head[N],cnt;
  15. int n,m;
  16. void add(int u,int v,int w){
  17. edge[cnt].w=w;
  18. edge[cnt].to=v;
  19. edge[cnt].next=head[u];
  20. head[u]=cnt++;
  21. }
  22. int dep[N];
  23. bool bfs(){
  24. memset(dep,0,sizeof(dep));
  25. queue<int> q;
  26. q.push(1);
  27. dep[1]=1;
  28. while(!q.empty()){
  29. int now=q.front();
  30. q.pop();
  31. for(int i=head[now];i!=-1;i=edge[i].next){
  32. int to=edge[i].to,w=edge[i].w;
  33. if(w&&(!dep[to])){
  34. dep[to]=dep[now]+1;
  35. q.push(to);
  36. if(to==n){
  37. return 1;
  38. }
  39. }
  40. }
  41. }
  42. return 0;
  43. }
  44. int dfs(int now,int f){
  45. if(now==n){
  46. return f;
  47. }
  48. int tmp=f;
  49. for(int i=head[now];i!=-1;i=edge[i].next){
  50. int to=edge[i].to,w=edge[i].w;
  51. if(w&&tmp&&dep[to]==dep[now]+1){
  52. int k=dfs(to,min(tmp,w));
  53. if(!k){
  54. dep[to]=0;
  55. continue;
  56. }
  57. edge[i].w-=k;
  58. edge[i^1].w+=k;
  59. tmp-=k;
  60. }
  61. }
  62. return f-tmp;
  63. }
  64. int ans;
  65. int main(){
  66. freopen("ditch.in","r",stdin);
  67. freopen("ditch.out","w",stdout);
  68. memset(head,-1,sizeof(head));
  69. scanf("%d%d",&m,&n);
  70. pos(i,1,m){
  71. int x,y,z;
  72. scanf("%d%d%d",&x,&y,&z);
  73. add(x,y,z);
  74. add(y,x,0);
  75. }
  76. while(bfs()){
  77. ans+=dfs(1,inf);
  78. }
  79. cout<<ans;
  80. return 0;
  81. }