#include<iostream>
/*
题意:就是寻找从源点到汇点的最大流!
要注意的是每两个点的流量可能有多个,也就是说有重边,所以要把两个点的所有的流量都加起来
就是这两个点之间的流量了! 思路:建图之后直接套用最大流算法(EK, 或者是Dinic算法) 图解Dinic算法流程!

*/
#include<queue>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f3f3f3f3f3f
#define N 205
using namespace std;
typedef long long LL;
LL cap[N][N]; int m, n;
LL maxFlow;
int d[N];
queue<int>q; bool bfs(){
q.push();
memset(d, , sizeof(d));
d[]=;
while(!q.empty()){
int u=q.front();
q.pop();
for(int v=; v<=n; ++v)
if(!d[v] && cap[u][v]>){
d[v]=d[u]+;
q.push(v);
}
}
if(!d[n]) return false;
return true;
} LL dfs(int u, LL flow){
if(u==n) return flow;
for(int v=; v<=n; ++v)
if(d[v]==d[u]+ && cap[u][v]>){
LL a=dfs(v, min(flow, cap[u][v]));
if(a==) continue;//如果a==0 说明没有找到从起点到汇点的增广路, 然后换其他路接着寻找!
cap[u][v]-=a;
cap[v][u]+=a;
return a;
}
return ;
} void Dinic(){
LL flow;
while(bfs()){//利用bfs构造好层次图,这样dfs在寻找阻塞流的时候,就不会盲目的寻找了!
while(flow=dfs(, INF)) maxFlow+=flow;//利用构造好的层次图不断的寻找阻塞流!
}
} int main(){
while(scanf("%d%d", &m, &n)!=EOF){
memset(cap, , sizeof(cap));
while(m--){
int u, v;
LL w;
scanf("%d%d%lld", &u, &v, &w);
cap[u][v]+=w;
}
maxFlow=;
Dinic();
printf("%lld\n", maxFlow);
}
return ;
}
 //EK算法同样搞定
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
typedef __int64 LL;
LL cap[][];
int pre[];
LL a[];
int m, n;
queue<int>q;
LL maxFlow;
bool spfa(){
while(!q.empty()) q.pop();
memset(a, , sizeof(a));
q.push();
a[]=INF;
while(!q.empty()){
int u=q.front();
q.pop();
for(int v=; v<=n; ++v)
if(!a[v] && cap[u][v]>){
pre[v]=u;
a[v]=min(a[u], cap[u][v]);
q.push(v);
}
if(a[n]) break;
}
if(!a[n]) return false;
return true;
} void EK(){
maxFlow=;
while(spfa()){
int u=n;
maxFlow+=a[n];
while(u!=){
cap[pre[u]][u]-=a[n];
cap[u][pre[u]]+=a[n];
u=pre[u];
}
}
}
int main(){
while(scanf("%d%d", &m, &n)!=EOF){
memset(cap, , sizeof(cap));
while(m--){
int u, v;
LL w;
scanf("%d%d%I64d", &u, &v, &w);
cap[u][v]+=w;
}
EK();
printf("%I64d\n", maxFlow);
}
return ;
}

最新文章

  1. G - 非常可乐
  2. PHP比较操作符详解(转自hack58)
  3. vijos 1025 背包 *
  4. 初级——程序如何打包成apk文件
  5. poj 3007 Organize Your Train part II(静态字典树哈希)
  6. 使用关联对象(AssociatedObject)为UIButton添加Block响应
  7. Java排序方法sort的使用详解
  8. Linux学习——shell编程之环境变量配置文件
  9. 手把手教学系列:从零开始配置VPS服务器
  10. 软件工程(GZSD2015) 第三次作业
  11. SQL语句:如何让字符串转化数字
  12. mssql sqlserver 关键字 GROUPING用法简介及说明
  13. 如何征服面试官,拿到Offer [转]
  14. 全网最详细的Sublime Text 3的插件官方网站(图文详解)
  15. Sql Server 中使用日期遍历
  16. 【JQuery】文档操作
  17. scp 从本地往线上传文件
  18. UEditor 中配置可以跨域访问的图片路径
  19. mongodb 增查改删
  20. sqlplus连接oracle语法

热门文章

  1. PHP多文件上传(二维数组$_FILES(&#39;文件域的名称&#39;),move_uploaded_file(‘临时文件名’,‘新的文件名’))
  2. HTML5的文档结构和新增标签
  3. JavaWeb开发学习(一)-JavaWeb开发概述
  4. CentOS7使用阿里云镜像安装Mongodb
  5. http://blog.sina.com.cn/s/blog_4c3b6a070100etad.html
  6. ajax跟取后台 josn 之 josn理解
  7. InnoSetup 如何获取安装程序的路径?
  8. 用于主题检测的临时日志(431b1c14-8b75-4f42-994f-cfda72208c10 - 3bfe001a-32de-4114-a6b4-4005b770f6d7)
  9. FusionCharts简单教程(三)-----FusionCharts的基本属性
  10. ECMAScript5的其它新特性