题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532

最大流模板题;

EK:(复杂度为n*m*m);

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 0xfffffff
#define N 220
int maps[N][N], pre[N], ans;
bool bfs(int s, int e)
{
memset(pre, , sizeof(pre));
queue<int>Q;
Q.push(s);
while(Q.size())
{
int i = Q.front();
Q.pop();
if(i == e)
return true;
for(int j=; j<=e; j++)
{
if(pre[j]== && maps[i][j] > )
{
pre[j] = i;
Q.push(j);
}
}
}
return false;
}
void EK(int s, int e)
{
while(bfs(s, e))
{
int Min = INF;
for(int i=e; i!=s; i=pre[i])
Min=min(maps[pre[i]][i], Min);
for(int i=e; i!=s; i=pre[i])
{
maps[pre[i]][i]-=Min;
maps[i][pre[i]]+=Min;
}
ans+=Min;
}
}
int main()
{
int n, m, x, y,c;
while(scanf("%d%d", &m, &n)!=EOF)
{
memset(maps, , sizeof(maps));
for(int i=; i<=m; i++)
{
scanf("%d%d%d", &x, &y, &c);
maps[x][y] += c;
}
ans = ;
EK(, n);
printf("%d\n", ans);
}
return ;
}

Dinic:(复杂度为n*n*m)

#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std; #define N 220
#define INF 0xfffffff int n, ans, Head[N], cnt, Layer[N];
struct Edge
{
int v, flow, next;
} e[*N]; void Add(int u, int v, int flow)
{
e[cnt].v = v;
e[cnt].flow = flow;
e[cnt].next = Head[u];
Head[u] = cnt++;
}
bool bfs(int S, int E)
{
memset(Layer, , sizeof(Layer));
Layer[S] = ;
queue<int>Q;
Q.push(S);
int p, q;
while(!Q.empty())
{
p = Q.front();
Q.pop();
if(p == E)return true;
for(int i=Head[p]; i!=-; i=e[i].next)
{
q = e[i].v;
if(!Layer[q] && e[i].flow)
{
Layer[q] = Layer[p]+;
Q.push(q);
}
}
}
return false;
}
int dfs(int u, int MaxFlow, int E)
{
if(u == E)return MaxFlow;
int uflow=;
for(int i=Head[u]; i!=-; i=e[i].next)
{
int v = e[i].v;
if(Layer[v]==Layer[u]+ && e[i].flow)
{
int flow = min(e[i].flow, MaxFlow - uflow);
flow = dfs(v, flow, E); e[i].flow -= flow;
e[i^].flow += flow;
uflow += flow;
if(uflow==MaxFlow)break;
}
}
if(uflow==)
Layer[u]=;
return uflow;
}
void Dinic()
{
while(bfs(, n))
{
ans+=dfs(, INF, n);
}
}
int main()
{
int a, b, flow, m;
while(scanf("%d%d", &m, &n)!=EOF)
{
memset(Head, -, sizeof(Head));
cnt = ;
for(int i=; i<=m; i++)
{
scanf("%d%d%d", &a, &b, &flow);
Add(a, b, flow);
Add(b, a, );
}
ans = ;
Dinic();
printf("%d\n", ans);
}
return ;
}

最新文章

  1. 通过Http接口及SolrNet 两种方法基于Solr5.5.1 实现CURD
  2. hive数据操作
  3. JS组件系列——封装自己的JS组件
  4. ElasticSearch 日期赋值
  5. core--线程同步(用户模式)
  6. CKEditor和IMCE构建drupal编辑器
  7. jmeter 响应结果分析二
  8. BootStrap入门_创建第一个例子
  9. 武汉科技大学ACM :1002: 零起点学算法66——反话连篇
  10. ural 1874 Football Goal
  11. ifconfig 源码
  12. Android - DrawerLayout
  13. mysql中独立表空间与共享表空间之前如何切换
  14. spring 上传文件文件的一个例子,
  15. MySQL中0、&#39;0&#39;作为条件时的区别
  16. 记一次搭建vsftp服务器坑
  17. java 获取两个日期之间的所有日期(年月日)
  18. 转:String StringBuffer StringBuilder区别
  19. Evernote如何邮件分享
  20. 用一个for循环实现打印乘法口诀表

热门文章

  1. JS学习笔记(1)--sort排序
  2. phpstrom直接运行和调试php
  3. Unix系统编程()信号类型和默认行为
  4. SpringMVC请求后台地址URL没有.*的几种实现方式
  5. exit会结束一个进程
  6. Android——初学
  7. JDK1.8与spring3.x的不兼容
  8. Windows 使用 Gitblit 搭建 Git 服务器
  9. BI开发之——Mdx基础语法(2)(转至指尖流淌)
  10. 织梦dede模板中广告的去除方法?