ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)
第一题:按顾客访问猪圈的顺序依次构图(顾客为结点),汇点->第一个顾客->第二个顾客->...->汇点
//第一道网络流
//Ford-Fulkerson
//Time:47Ms Memory:276K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; #define MAXN 105 //顾客
#define MAXM 1005 //猪圈
#define INF 0x3f3f3f3f struct Arc {
int c, f;
}e[MAXN][MAXN]; int n, m;
int s, t;
int pig[MAXM], last[MAXM]; //last[]:猪圈当前顾客(0为源点,n+1为汇点)
int pre[MAXN]; //1.从哪一个结点
int alpha[MAXN]; //2.可改进量 void ford() //ford fulkerson
{
alpha[s] = INF; //源点可改进量无限
while (1) { //多次标号
memset(pre, -1, sizeof(pre)); //初始标号
queue<int> q;
q.push(s);
while (!q.empty() && pre[t] == -1) {
int cur = q.front(); q.pop();
for (int i = 1; i <= t; i++)
{
int tmp;
//tmp 为非0可保证邻接且保证有剩余流量
if (pre[i] == -1 && (tmp = e[cur][i].c - e[cur][i].f))
{
pre[i] = cur;
q.push(i);
alpha[i] = min(alpha[cur], tmp);
}
}
}
if (pre[t] == -1) return; //未找到增广路
for (int i = pre[t], j = t; i != -1; j = i, i = pre[i])
{
e[i][j].f += alpha[t];
e[j][i].f = -e[i][j].f;
}
} } int main()
{
//freopen("in.txt", "r", stdin); memset(last, 0, sizeof(last));
memset(e, 0, sizeof(e));
scanf("%d%d", &m, &n);
s = 0; t = n + 1;
for (int i = 1; i <= m; i++)
scanf("%d", &pig[i]);
for (int i = 1; i <= n; i++)
{
int num; //钥匙数
scanf("%d", &num);
while (num--) {
int pn;
scanf("%d", &pn);
if (last[pn] == 0)
e[last[pn]][i].c += pig[pn];
else e[last[pn]][i].c = INF;
last[pn] = i;
}
scanf("%d", &e[i][t].c);
} ford(); int maxFlow = 0;
for (int i = 1; i < t; i++)
maxFlow += e[i][t].f;
printf("%d\n", maxFlow); return 0;
}
第二道:最短增广路(SAP)算法,dinic算法前身,与dinic不同的是需要多次采用BFS进行构建层次网络,题目本身较直接。
//网络流
//一般最短增广路算法-Dinic算法的前身
//Time:16Ms Memory:676K
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std; #define MAX 205
#define INF 0x3f3f3f3f struct Arc {
int c, f;
}e[MAX][MAX]; int n, m;
int s, t;
int pre[MAX];
int res[MAX][MAX]; //残留网络->层次网络
bool v[MAX]; void bfs()
{
while (1) //多次BFS寻找增广路
{
memset(v, false, sizeof(v));
memset(res, 0, sizeof(res));
memset(pre, 0, sizeof(pre));
queue<int> q;
q.push(s); v[s] = true;
while (!q.empty() && pre[t] == 0)
{ //BFS构造层次网络
int cur = q.front(); q.pop();
for (int i = 1; i <= n; i++)
{
if (!v[i]) {
int tmp = e[cur][i].c - e[cur][i].f;
if (tmp > 0) { //正向有残留容量
res[cur][i] = tmp;
pre[i] = cur;
q.push(i); v[i] = true;
}
else if (e[i][cur].f > 0) { //反向有流量
res[cur][i] = e[i][cur].f;
pre[i] = cur;
q.push(i); v[i] = true;
}
}
}
}
if (pre[t] == 0) return;
int minroad = INF; //最小可改进量
for (int i = t; i != s; i = pre[i])
minroad = min(minroad, res[pre[i]][i]);
for (int i = t; i != s; i = pre[i])
{
if (e[pre[i]][i].c - e[pre[i]][i].f > 0)
e[pre[i]][i].f += minroad;
else if (e[i][pre[i]].f > 0)
e[i][pre[i]].f -= minroad;
} }
} int main()
{
//freopen("in.txt", "r", stdin); while (~scanf("%d%d", &m, &n))
{
memset(e, 0, sizeof(e));
int u, v, c;
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &u, &v, &c);
e[u][v].c += c;
} s = 1; t = n;
bfs(); int maxFlow = 0;
for (int i = 1; i < n; i++)
maxFlow += e[i][t].f;
printf("%d\n", maxFlow);
} return 0;
}
ACM/ICPC 之 网络流入门-Ford Fulkerson与SAP算法(POJ1149-POJ1273)的更多相关文章
- ACM/ICPC 之 网络流入门-EK算法(参考模板)(POJ1273)
基于残留网络与FF算法的改进-EK算法,核心是将一条边的单向残留容量的减少看做反向残留流量的增加. //网络流 //EK算法 //Time:16Ms Memory:348K #include<i ...
- ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)
POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...
- ACM/ICPC 之 网络流-拆点构图(POJ2391)
需要直接到达,因此源点经过三条边后必须要达到汇点,但为了保证网络流的正确性(路径可反悔),因此不可限制层次网络的最高层次为3,最好的方法既是让所有点拆分成两个点,一个点从汇点进入,一个点通向汇点,任意 ...
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- ACM - ICPC World Finals 2013 C Surely You Congest
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...
- 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
队名:Unlimited Code Works(无尽编码) 队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...
- 2016 ACM ICPC Asia Region - Tehran
2016 ACM ICPC Asia Region - Tehran A - Tax 题目描述:算税. solution 模拟. B - Key Maker 题目描述:给出\(n\)个序列,给定一个序 ...
- 2017 ACM ICPC Asia Regional - Daejeon
2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...
随机推荐
- Linq 操作基础
参考资料: LINQ系列:LINQ to DataSet的DataTable操作 List<T>转换为DataTable C# DataTable 和List之间相互转换的方法 Linq中 ...
- OB函数
ob_start 打开输出控制缓冲 ob_get_contents 返回输出缓冲区内容 ob_clean 清空( ...
- 点击自动显示/隐藏DIV代码。(简单实用)
注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 很多时候我们需要将DIV的信息默认为隐藏状态,只有当用户点击时才显示DIV中包含的提示文字.这类效果在互联网上应用得很多,但实现的方 ...
- js 日期处理,json处理
模块化js :requirejshttp://www.requirejs.cn/ 好用的日期控件:http://www.bootcss.com/p/bootstrap-datetimepicker/i ...
- 必须知道的.net(字段、属性和方法)
1.字段 通常定义为private(封装原则) 2.属性(property) 通常定义为public,表示类的对外成员.具有可读可写属性,通过get和set访问器实现 3.索引器(indexer) C ...
- Spring配置bean文件的底层实现方式
首先 bean文件如下: <beans> <bean id="date" class="java.util.Date"></bea ...
- Swift3.0P1 语法指南——基础
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- window 常用软件
参考链接: http://www.aiweibang.com/yuedu/721140.html http://www.aiweibang.com/yuedu/145263218.html 1.wox ...
- javascript高级程序设计---CSS操作
CSS与JavaScript是两个有着明确分工的领域,前者负责页面的视觉效果,后者负责与用户的行为互动.但是,它们毕竟同属网页开发的前端,因此不可避免有着交叉和互相配合. HTML元素的style属性 ...
- vncserver和Ubuntu Xfce4远程桌面环境的配置,解决不显示图形界面
vncserver和Ubuntu Xfce4远程桌面环境的配置 参考的http://blog.163.com/thinki_cao/blog/static/8394487520130301453180 ...