HDU 3549 Flow Problem (dinic模版 && isap模版)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549
题意:
给你一个有向图,问你1到n的最大流。
dinic模版 (n*n*m)
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- const int N = ; //点个数
- const int M = ; //边个数
- const int inf = 0x3f3f3f3f;
- struct Edge {
- int to, next, cap, flow;
- }edge[M];
- int tot, head[N];
- void init() {
- tot = 0;
- memset(head, -, sizeof(head));
- }
- inline void add(int u, int v, int w, int rw = ) {
- edge[tot].to = v; edge[tot].cap = w; edge[tot].flow = ;
- edge[tot].next = head[u]; head[u] = tot++;
- edge[tot].to = u; edge[tot].cap = rw; edge[tot].flow = ;
- edge[tot].next = head[v]; head[v] = tot++;
- }
- int Q[N];
- int dep[N], cur[N], sta[N];
- bool bfs(int s, int t, int n) {
- int front = , tail = ;
- memset(dep, -, sizeof(dep[])*(n + ));
- dep[s] = ;
- Q[tail++] = s;
- while(front < tail) {
- int u = Q[front++];
- for(int i = head[u]; ~i; i = edge[i].next) {
- int v = edge[i].to;
- if(edge[i].cap > edge[i].flow && dep[v] == -) {
- dep[v] = dep[u] + ;
- if(v == t)
- return true;
- Q[tail++] = v;
- }
- }
- }
- return false;
- }
- int dinic(int s, int t, int n) {
- int maxflow = ;
- while(bfs(s, t, n)) {
- for(int i = ; i < n; ++i)
- cur[i] = head[i];
- int u = s, tail = ;
- while(cur[s] != -) {
- if(u == t) {
- int tp = inf;
- for(int i = tail - ; i >= ; --i) {
- tp = min(tp, edge[sta[i]].cap - edge[sta[i]].flow);
- }
- maxflow += tp;
- for(int i = tail - ; i >= ; --i) {
- edge[sta[i]].flow += tp;
- edge[sta[i] ^ ].flow -= tp;
- if(edge[sta[i]].cap - edge[sta[i]].flow == )
- tail = i;
- }
- u = edge[sta[tail] ^ ].to;
- } else if(cur[u] != - && edge[cur[u]].cap > edge[cur[u]].flow && dep[u] + == dep[edge[cur[u]].to]) {
- sta[tail++] = cur[u];
- u = edge[cur[u]].to;
- } else {
- while(u != s && cur[u] == -) {
- u = edge[sta[--tail] ^ ].to;
- }
- cur[u] = edge[cur[u]].next;
- }
- }
- }
- return maxflow;
- }
- int main()
- {
- int t, n, m, u, v, c;
- scanf("%d", &t);
- for(int ca = ; ca <= t; ++ca) {
- scanf("%d %d", &n, &m);
- init();
- for(int i = ; i <= m; ++i) {
- scanf("%d %d %d", &u, &v, &c);
- add(u, v, c);
- }
- printf("Case %d: %d\n", ca, dinic(, n, n));
- }
- return ;
- }
貌似一般比dinic更优一点
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- const int N = 1e3 + ;
- const int M = 1e4 + ;
- const int inf = 0x3f3f3f3f;
- struct Edge {
- int to, next, cap, flow;
- }edge[M];
- int tot, head[N], gap[N], dep[N], cur[N];
- void init() {
- tot = ;
- memset(head, -, sizeof(head));
- }
- void addedge(int u, int v, int w, int rw = ) {
- edge[tot].next = head[u]; edge[tot].to = v; edge[tot].cap = w; edge[tot].flow = ; head[u] = tot++;
- edge[tot].next = head[v]; edge[tot].to = u; edge[tot].cap = rw; edge[tot].flow = ; head[v] = tot++;
- }
- int Q[N];
- void bfs(int start, int end) {
- memset(dep, -, sizeof(dep));
- memset(gap, , sizeof(gap));
- gap[] = ;
- int front = , rear = ;
- dep[end] = ;
- Q[rear++] = end;
- while(front != rear) {
- int u = Q[front++];
- for(int i = head[u]; ~i; i = edge[i].next) {
- int v = edge[i].to;
- if(dep[v] != -)
- continue;
- Q[rear++] = v;
- dep[v] = dep[u] + ;
- gap[dep[v]]++;
- }
- }
- }
- int S[N];
- int sap(int start, int end, int N) {
- bfs(start, end);
- memcpy(cur, head, sizeof(head));
- int top = ;
- int u = start;
- int ans = ;
- while(dep[start] < N) {
- if(u == end) {
- int Min = inf;
- int inser;
- for(int i = ; i < top; ++i) {
- if(Min > edge[S[i]].cap - edge[S[i]].flow) {
- Min = edge[S[i]].cap - edge[S[i]].flow;
- inser = i;
- }
- }
- for(int i = ; i < top; ++i) {
- edge[S[i]].flow += Min;
- edge[S[i] ^ ].flow -= Min;
- }
- ans += Min;
- top = inser;
- u = edge[S[top] ^ ].to;
- continue;
- }
- bool flag = false;
- int v;
- for(int i = cur[u]; ~i; i = edge[i].next) {
- v = edge[i].to;
- if(edge[i].cap - edge[i].flow && dep[v] + == dep[u]) {
- flag = true;
- cur[u] = i;
- break;
- }
- }
- if(flag) {
- S[top++] = cur[u];
- u = v;
- continue;
- }
- int Min = N;
- for(int i = head[u]; ~i; 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 + ;
- gap[dep[u]]++;
- if(u != start)
- u = edge[S[--top] ^ ].to;
- }
- return ans;
- }
- int main()
- {
- int t, n, m, u, v, c;
- scanf("%d", &t);
- for(int ca = ; ca <= t; ++ca) {
- scanf("%d %d", &n, &m);
- init();
- for(int i = ; i < m; ++i) {
- scanf("%d %d %d", &u, &v, &c);
- addedge(u, v, c);
- }
- printf("Case %d: %d\n", ca, sap(, n, n));
- }
- return ;
- }
HDU 3549 Flow Problem (dinic模版 && isap模版)的更多相关文章
- hdu 3549 Flow Problem (Dinic)
Flow ProblemTime Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- HDU 3549 Flow Problem(最大流)
HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...
- 网络流 HDU 3549 Flow Problem
网络流 HDU 3549 Flow Problem 题目:pid=3549">http://acm.hdu.edu.cn/showproblem.php?pid=3549 用增广路算法 ...
- hdu 3549 Flow Problem
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Description Network flow is a well- ...
- hdu 3549 Flow Problem【最大流增广路入门模板题】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...
- HDU 3549 Flow Problem (最大流ISAP)
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- 网络流--最大流--HDU 3549 Flow Problem
题目链接 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, y ...
- hdu 3549 Flow Problem Edmonds_Karp算法求解最大流
Flow Problem 题意:N个顶点M条边,(2 <= N <= 15, 0 <= M <= 1000)问从1到N的最大流量为多少? 分析:直接使用Edmonds_Karp ...
- HDU 3549 Flow Problem 网络流(最大流) FF EK
Flow Problem Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
随机推荐
- “帮你APP”团队冲刺1
1.整个项目预期的任务量 (任务量 = 所有工作的预期时间)和 目前已经花的时间 (所有记录的 ‘已经花费的时间’),还剩余的时间(所有工作的 ‘剩余时间’) : 所有工作的预期时间:88h 目前已经 ...
- Nodejs-文件流
1.什么是流? 流是程序输入输出的一个连续的字节序列. 有文件流,网络流,设备(例如鼠标,键盘,磁盘,调制解调器和打印机)的输入输出都是用流来处理的. 任何数据的最根本表现形式都是二进制. 读取文件 ...
- Mac OS 添加 MySQL 环境变量
1.打开终端,输入: cd ~ 会进入~文件夹 2.如果 ~ 文件夹中已经存在 .bash_profile 文件,则在 : 后面追加你想要添加的路径, 3. 否则输入:touch .bash_prof ...
- Struts2请求流程
1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可 ...
- vivo和OPPO手机刷机
vivo和OPPO手机是蓝绿两厂,定位年轻时尚女士,比较注重拍照和听音乐,其他无视. 系统很少更新,Root和刷机也比较困难,建议是直接卡刷. 小米手机耍猴(猴子精,代指懂点手机的人) 蓝绿两厂是耍猪 ...
- 基于jQuery的插件
jQuery Validation 验证框架 jQuery Form Ajax表单插件 jQuery UI插件 Easy UI
- Markdown语法图解
Markdown语法图解 文章目录 快捷键 基本语法 对字体设置斜体.粗体.删除线 分级标题 链接 分割线 代码块 引用 列表 表格 常用技巧 换行 缩进字符 如何打出一些特殊符号 字体.字号与颜色 ...
- BZOJ3129 [Sdoi2013]方程 【扩展Lucas】
题目 给定方程 X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A X2 < = A2 Xn1 < = An1 我们对第n1 + 1..n1+n2个 ...
- 七牛云的cdn配置
https://segmentfault.com/q/1010000004265556
- ReactJS 学习路线
Node.js: 推荐采用nvm的方式安装,nvm(Node Version Manager)用于Node的版本管理,方便不同版本的Node之间的切换 安装npm,npm(Node Package M ...