(网络流 最大流 Dinic || SAP)Control -- hdu --4289
链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4289
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82835#problem/I
代码:
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #include<queue>
- using namespace std;
- #define N 510
- #define INF 0x3fffffff
- struct node {int v, flow, next;} a[N*N];
- int G[N][N], g[N][N], Layer[N], Head[N], cnt, n, m;
- void Init()
- {
- cnt = ;
- memset(Head, -, sizeof(Head));
- }
- void Add(int u, int v, int flow)
- {
- a[cnt].v = v;
- a[cnt].flow = flow;
- a[cnt].next = Head[u];
- Head[u] = cnt++;
- swap(u, v);
- a[cnt].v = v;
- a[cnt].flow = ;
- a[cnt].next = Head[u];
- Head[u] = cnt++;
- }
- bool BFS(int Start, int End)
- {
- queue<int>Q;
- Q.push(Start);
- memset(Layer, , sizeof(Layer));
- Layer[Start] = ;
- while(Q.size())
- {
- int u = Q.front(); Q.pop();
- if(u==End) return true;
- for(int i=Head[u]; i!=-; i=a[i].next)
- {
- int v = a[i].v;
- if(!Layer[v] && a[i].flow)
- {
- Layer[v] = Layer[u] + ;
- Q.push(v);
- }
- }
- }
- return false;
- }
- int DFS(int u, int MaxFlow, int End)
- {
- if(u==End) return MaxFlow;
- int uflow=;
- for(int i=Head[u]; i!=-; i=a[i].next)
- {
- int v = a[i].v;
- if(Layer[v]==Layer[u]+ && a[i].flow)
- {
- int flow = min(a[i].flow, MaxFlow-uflow);
- flow = DFS(v, flow, End);
- a[i].flow -= flow;
- a[i^].flow += flow;
- uflow += flow;
- if(uflow==MaxFlow) break;
- }
- }
- if(uflow==) Layer[u] = ;
- return uflow;
- }
- int Dinic(int Start, int End)
- {
- int MaxFlow=;
- while(BFS(Start, End)==true)
- MaxFlow += DFS(Start, INF, End);
- return MaxFlow;
- }
- int main()
- {
- while(scanf("%d%d", &n, &m)!=EOF)
- {
- int Start, End, i, flow, u, v;
- scanf("%d%d", &Start, &End);
- Init();
- for(i=; i<=n; i++)
- {
- scanf("%d", &flow);
- Add(i, i+n, flow);
- }
- for(i=; i<=m; i++)
- {
- scanf("%d%d", &u, &v);
- Add(u+n, v, INF);
- Add(v+n, u, INF);
- }
- printf("%d\n", Dinic(Start, End+n));
- }
- return ;
- }
粘大神的代码,其实不懂SAP,先借鉴一下,等等在研究
SAP:
- const int MAXN=;//点数的最大值
- const int MAXM=;//边数的最大值
- const int INF=0x3f3f3f3f;
- struct Node
- {
- int from,to,next;
- int cap;
- }edge[MAXM];
- int tol;
- int head[MAXN];
- int dep[MAXN];
- int gap[MAXN];//gap[x]=y :说明残留网络中dep[i]==x的个数为y
- int n;//n是总的点的个数,包括源点和汇点
- void init()
- {
- tol=;
- memset(head,-,sizeof(head));
- }
- void addedge(int u,int v,int w)
- {
- edge[tol].from=u;
- edge[tol].to=v;
- edge[tol].cap=w;
- edge[tol].next=head[u];
- head[u]=tol++;
- edge[tol].from=v;
- edge[tol].to=u;
- edge[tol].cap=;
- edge[tol].next=head[v];
- head[v]=tol++;
- }
- void BFS(int start,int end)
- {
- memset(dep,-,sizeof(dep));
- memset(gap,,sizeof(gap));
- gap[]=;
- int que[MAXN];
- int front,rear;
- front=rear=;
- dep[end]=;
- que[rear++]=end;
- while(front!=rear)
- {
- int u=que[front++];
- if(front==MAXN)front=;
- for(int i=head[u];i!=-;i=edge[i].next)
- {
- int v=edge[i].to;
- if(dep[v]!=-)continue;
- que[rear++]=v;
- if(rear==MAXN)rear=;
- dep[v]=dep[u]+;
- ++gap[dep[v]];
- }
- }
- }
- int SAP(int start,int end)
- {
- int res=;
- BFS(start,end);
- int cur[MAXN];
- int S[MAXN];
- int top=;
- memcpy(cur,head,sizeof(head));
- int u=start;
- int i;
- while(dep[start]<n)
- {
- if(u==end)
- {
- int temp=INF;
- int inser;
- for(i=;i<top;i++)
- if(temp>edge[S[i]].cap)
- {
- temp=edge[S[i]].cap;
- inser=i;
- }
- for(i=;i<top;i++)
- {
- edge[S[i]].cap-=temp;
- edge[S[i]^].cap+=temp;
- }
- res+=temp;
- top=inser;
- u=edge[S[top]].from;
- }
- if(u!=end&&gap[dep[u]-]==)//出现断层,无增广路
- break;
- for(i=cur[u];i!=-;i=edge[i].next)
- if(edge[i].cap!=&&dep[u]==dep[edge[i].to]+)
- break;
- if(i!=-)
- {
- cur[u]=i;
- S[top++]=i;
- u=edge[i].to;
- }
- else
- {
- int min=n;
- for(i=head[u];i!=-;i=edge[i].next)
- {
- if(edge[i].cap==)continue;
- if(min>dep[edge[i].to])
- {
- min=dep[edge[i].to];
- cur[u]=i;
- }
- }
- --gap[dep[u]];
- dep[u]=min+;
- ++gap[dep[u]];
- if(u!=start)u=edge[S[--top]].from;
- }
- }
- return res;
- }
(网络流 最大流 Dinic || SAP)Control -- hdu --4289的更多相关文章
- [讲解]网络流最大流dinic算法
网络流最大流算法dinic ps:本文章不适合萌新,我写这个主要是为了复习一些细节,概念介绍比较模糊,建议多刷题去理解 例题:codevs草地排水,方格取数 [抒情一下] 虽然老师说这个多半不考,但是 ...
- I - Control - HDU 4289 (最大流)
题意:有N个城市,现在城市S出现了一伙歹徒,他们想运送一些炸弹到D城市,不过警方已经得到了线报知道他们的事情,不过警察不知道他们所在的具体位置,所以只能采取封锁城市的办法来阻断暴徒,不过封锁城市是需要 ...
- Power Network(网络流最大流 & dinic算法 + 优化)
Power Network Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 24019 Accepted: 12540 D ...
- 网络流最大流——dinic算法
前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问 ...
- 最大流 Dinic + Sap 模板
不说别的,直接上模板. Dinic+当前弧优化: struct Edge{ int x,y,c,ne; }e[M*]; int be[N],all; int d[N],q[N]; int stack[ ...
- 网络流--最大流dinic模板
标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 #include<stdio.h> //差不多要加这么些头文件 #includ ...
- UESTC 1143 数据传输 网络流 最大流 Dinic
数据传输 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...
- 网络流最大流dinic
hdu 6214 #include <bits/stdc++.h> #include<cstdio> #include<cstring> #include<q ...
- 【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)
题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤ ...
随机推荐
- vim跳转到指定行
第一种方法 在编辑模式下(非输入模式)下输入ngg 或者 nGn为指定的行数(如25)25gg或者25G 跳转到第25行. 25gg 第二种方法 在命令模式下输入行号n : n 查看当然光标所在的行和 ...
- 输入N组父子对,求父子对所组成的二叉树的高度----17年某公司的笔试题
题目的大致意思如下: 输入N组数,一组数代表一个父子对(如,0 1,0代表父节点,1代表子节点),求这N组数所组成的二叉树的高度: 例如: 输入:6 0 1 0 2 1 3 1 4 2 5 ...
- 在windows 2008 R2中SQl Server 2008中代理启动失败的一个原因总结
启动SQL代理的时候报错如下: 关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾. ************** 异常文本 **************System.NullRef ...
- 吴裕雄 数据挖掘与分析案例实战(10)——KNN模型的应用
# 导入第三方包import pandas as pd # 导入数据Knowledge = pd.read_excel(r'F:\\python_Data_analysis_and_mining\\1 ...
- Ubuntu 安装 Zabbix 3.2详细步骤
创建 zabbix 用户 因为zabbix 程序的守护进程需要非特权用户,所以需要创建一个 zabbix 用户,即使从 root 用户启动 zabbix 程序,也会自动切换到 zabbix 用户,所以 ...
- VScode 安装必备
1.运行程序:
- blast及其格式输出简介
1)blast产生背景 双序列比对可以采用是基于动态规划算法的Needleman-Wunsch(NW)和Smith-Waterman algorithm(SW)算法,虽然精度高,但计算消耗大.当与数据 ...
- test5
## 前言 因为vs2010没有集成mvvmlight 所以想要使用mvvmlight的relaycomman需要引用dll 需要测试某个功能的时候,不能进行快带的集成 ## 引用mvvmlight ...
- 第六章 图(d)深度优先搜索
- 第十章 泛型程序设计与C++标准模板库 泛型程序设计及STL的结构