Drainage Ditches

自己拉的专题里面没有这题,网上找博客学习网络流的时候看到闯亮学长的博客然后看到这个网络流入门题!随手一敲WA了几发看讨论区才发现坑点!

本题采用的是Edmonds-Karp算法求增广路。小白书上只介绍了这个算法,确实对于数据不刁钻的题目这个算法足以应对。大白书上的Dinic及SAP、ISAP还没有去看,以后慢慢攻克吧!

回到这个题:n条水渠,m个交点,每条水渠有一个最大容量cap,求1号交点到m号交点的最大流。

学了EK算法这题就可以裸引用了,只是注意一个坑点:重边的时候既不是取最大、也不是取最小,而是+=

int a[N],p[N],flow[N][N],cap[N][N];
int n,m;
void init()
{
memset(flow,0,sizeof(flow));//流量,初始设为0
memset(cap,0,sizeof(cap));//容量,开始为0表示这条通道不存在
}
void EK()
{
// memset(p,0,sizeof(p));
queue<int>q;
ll f=0;//最大流
while(1)
{
memset(a,0,sizeof(a));
a[1]=INF;
q.push(1);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int v=1; v<=m; v++)
if(!a[v]&&cap[u][v]>flow[u][v])
{
p[v]=u;
q.push(v);
a[v]=min(a[u],cap[u][v]-flow[u][v]);
}
}
if(!a[m]) break;
for(int i=m; i!=1; i=p[i])
{
flow[p[i]][i]+=a[m];
flow[i][p[i]]-=a[m];
}
f+=a[m];
}
printf("%I64d\n",f);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
int s,t,e;
for(int i=0; i<n; i++)
{
scanf("%d%d%d",&s,&t,&e);
cap[s][t]=cap[s][t]+e;
}
EK();
}
return 0;
}

给出闯亮学长的博客,写的很好,很适合初学者:http://blog.csdn.net/y990041769/article/details/21026445



最新文章

  1. myeclipse eclipse 使用git插件访问github 的解决方案
  2. 编程模式之观察者模式(Observer)
  3. Python小例子(判断质数)
  4. 移动端设备UA检测
  5. 黑马程序员——【Java基础】——Java概述
  6. Oracle数据库—— PL/SQL基础编程
  7. WPF弹性模拟动画
  8. TCP点对点转发的实现与原理(nodejs)
  9. Sql server2012转sql server2008步骤经验总结(转)
  10. Hadoop错误之namenode宕机的数据恢复
  11. 真tm郁闷
  12. ECC加密算法入门介绍 --- 看雪
  13. XOR and Favorite Number CodeForces - 617E -莫队-异或前缀和
  14. VS2017
  15. UWP 取消GridView、ListView鼠标选中、悬停效果
  16. 树莓派安装.net core 2.1
  17. easyui的datebox只显示年月
  18. RT-thread-2.0.1移植(基于STM32F4xx)
  19. 旧书重温:0day2【8】狙击windows的异常处理实验
  20. com线程模型01

热门文章

  1. JS排序--快速排序
  2. poj1717
  3. CSS 布局说——可能是最全的
  4. SetForegroundWindow、SetActiveWindow、SetFocus 如何将一个某个窗口提到最顶层
  5. Android View 背景选择器编写技巧
  6. [windows]桌面中添加我的电脑,我的文档和网上邻居图标
  7. 在Ubuntu16.04安装YouCompleteMe
  8. HDU 6052 To my boyfriend(容斥+单调栈)
  9. 使用prelu
  10. tcpdump简单使用