最大流SAP -邻接表模板
2015-06-05 23:27
246 查看
[code]const int MAXN = 1010;//点数的最大值 const int MAXM = 400010;//边数的最大值 const int INF = 0x3f3f3f3f; struct Edge { int to, next, cap, flow; }edge[MAXM];//注意是MAXM int tol; int head[MAXN]; int gap[MAXN], dep[MAXN], pre[MAXN], cur[MAXN]; void init() { tol = 0; memset(head, -1, sizeof(head)); } //加边,单向图三个参数,双向图四个参数 void addedge(int u, int v, int w, int rw = 0) { edge[tol].to = v; edge[tol].cap = w; edge[tol].next = head[u]; edge[tol].flow = 0; head[u] = tol++; edge[tol].to = u; edge[tol].cap = rw; edge[tol].next = head[v]; edge[tol].flow = 0; head[v] = tol++; } //输入参数:起点、终点、点的总数 //点的编号没有影响,只要输入点的总数 int sap(int start, int end, int N) { memset(gap, 0, sizeof(gap)); memset(dep, 0, sizeof(dep)); memcpy(cur, head, sizeof(head)); int u = start; pre[u] = -1; gap[0] = N; int ans = 0; while (dep[start] < N) { if (u == end) { int Min = INF; for (int i = pre[u]; i != -1; i = pre[edge[i ^ 1].to]) if (Min > edge[i].cap - edge[i].flow) Min = edge[i].cap - edge[i].flow; for (int i = pre[u]; i != -1; i = pre[edge[i ^ 1].to]) { edge[i].flow += Min; edge[i ^ 1].flow -= Min; } u = start; ans += Min; continue; } bool flag = false; int v; for (int i = cur[u]; i != -1; i = edge[i].next) { v = edge[i].to; if (edge[i].cap - edge[i].flow && dep[v] + 1 == dep[u]) { flag = true; cur[u] = pre[v] = i; break; } } if (flag) { u = v; continue; } int Min = N; for (int i = head[u]; i != -1; i = edge[i].next) if (edge[i].cap - edge[i].flow && dep[edge[i].to] < Min) { Min = dep[edge[i].to]; cur[u] = i; } gap[dep[u]]--; if (!gap[dep[u]])return ans; dep[u] = Min + 1; gap[dep[u]]++; if (u != start) u = edge[pre[u] ^ 1].to; } return ans; }
相关文章推荐
- java相关知识介绍
- stream_context_create()模拟POST/GET
- LIGHTOJ 1005 – ROOKS
- 史上最全最强SpringMVC详细示例实战教程
- MultiWarhead 球缺罩界面设计
- 一个质量高的demo
- OpenCSP开源程序解析之OPENCSP_Mutex.cpp
- 调试jz2440生成特定后缀的命令
- LIGHTOJ 1002 – COUNTRY ROADS 【求最大边最小的路径】
- MultiWarhead 界面设计
- Javascript表达式中连续的 && 和 || 之赋值区别
- 函数传参和实际应用—JS学习笔记2015-6-5(第49天)
- 调试jz2440生成特定后缀的命令
- GitHub for Windows一般操作
- PowerPC DevTree
- 编程流程
- 文章标题
- OpenCSP开源程序解析之OPENCSP_Main.cpp
- CetnOS minimal 网络不可用
- 杭电 2200