题目:Flow Problem

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int N=2050;     //N表示点的数量
const int M=2500000;  //M表示边的数量,注意应大于(N-1)*N,因为网络是双向的
const int INF=0x7fffffff;
int e;
int ver[M],next[M],flow[M];  //ver为边指向的节点,flow为边的容量,next为链表的下一条边
int head[N],work[N],dis[N],q[N]; //head为节点的链表头,work 用于算法中的临时链表头,dis 计算距离
void init()
{
e=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v,int c)  //增加一条从u到v容量为c的边
{
ver[e]=v;flow[e]=c;next[e]=head[u];head[u]=e++;
ver[e]=u;flow[e]=0;next[e]=head[v];head[v]=e++;
}
//广搜计算出每个点与源点的最短距离,如果不能到达汇点说明算法结束
int bfs(int S,int T)
{
int rear=0;
memset(dis,-1,sizeof(dis));
dis[S]=0;q[rear++]=S;
for(int i=0;i<rear;i++)
{
for(int j=head[q[i]];j!=-1;j=next[j])
{
if(flow[j]&&dis[ver[j]]==-1)
{
dis[ver[j]]=dis[q[i]]+1;
q[rear++]=ver[j];
if(ver[j]==T) return 1;
}
}
}
return 0;
}
//寻找可行流的增广路算法,按节点的距离来找,加快速度
int dfs(int cur,int a,int T)
{
if(cur==T) return a;
for(int &i=work[cur];i!=-1;i=next[i]) //work是临时链表头,这里用i引用它,这样寻找过的边不再寻找
{
if(flow[i]&&dis[ver[i]]==dis[cur]+1)
{
int t=dfs(ver[i],min(a,flow[i]),T);
if(t)
{
flow[i]-=t;
flow[i^1]+=t;  //正反向边容量改变
return t;
}
}
}
return 0;
}
//求最大流,直到没有可行流
long long Dinic(int S,int T)
{
long long ans=0;
while(bfs(S,T))
{
memcpy(work,head,sizeof(head));
while(int t=dfs(S,INF,T)) ans+=t;
}
return ans;
}
int main()
{
long long sum;
int t,n,m,S,T,x,y,c,k=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
S=1;T=n;
while(m--)
{
scanf("%d%d%d",&x,&y,&c);
add(x,y,c);
}
printf("Case %d: %I64d\n",k++,Dinic(S,T));
}
return 0;
}

HDU3549(最大流算法的Dinic算法)相关推荐

  1. 最大流EK和Dinic算法

    最大流EK和Dinic算法 EK算法 最朴素的求最大流的算法. 做法:不停的寻找增广路,直到找不到为止 代码如下: @Frosero #include <cstdio> #include ...

  2. 网络流最大流算法(ISAP算法及DINIC算法)

    这些算法网络中解释都有,所有以下是根据题目应用,代码中有注释,方便理解,ISAP算法就是通过先bfs一遍建立逆序求层数,然后每次都进行维护求最短路来求增广路径,下次查找建立在上次查找的最小路径的源点进 ...

  3. nyoj-239 月老的难题 (二分图匹配—匈牙利算法 网络流—Dinic算法)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

  4. 最大网络流算法之dinic算法

    文章目录 最大网络流 深度优先搜索 Dinic 第一个优化:高度数組 第二个优化 二.代码 最大网络流 首先要给出每一条线路的承载量,一定要把边都是有方向的.一定要指明一个源点跟目标点如图源点是A,目 ...

  5. 网络流-最大流(Ford-Fulkerson算法Dinic算法)

    文章目录 最大流 FF算法: 增广路: 反边: 代码: Dinic算法: Dinic + 当前弧优化 最大流 就如同水流,存在一张图,既有起点又有终点,从起点流向终点的最大流量就是最大流. 在上面的图 ...

  6. 图论:Dinic算法

    解决最大流问题我搜到了一堆的算法:EK算法.FF算法.Dinic算法.SAP算法.ISAP算法 然而并没有什么鸟用 掌握最常见的Dinic就够了,据说极限优化的ISAP比Dinic更快一些..我当不知 ...

  7. 求解最大流的四种算法介绍、利用最大流模型解题入门

    求解最大流的四种算法介绍.利用最大流模型解题入门 上一篇中介绍了网络流的基础,最大流最小割定理的证明,下面来看如何求一个容量网络的最大流,这里介绍四种算法:EK算法.SAP算法.DINIC算法.HLP ...

  8. Dinic算法----最大流常用算法之一

    --没有什么是一个BFS或一个DFS解决不了的:如果有,那就两个一起. 最大流的$EK$算法虽然简单,但时间复杂度是$O(nm^2)$,在竞赛中不太常用. 竞赛中常用的$Dinic$算法和$SAP$, ...

  9. 图论 —— 网络流 —— 最大流 —— Dinic 算法

    [概述] Dinic 算法在 EK 算法的基础上进行了优化,其时间复杂度为 O(n*n*m). Dinic 在找增广路的时也是找最短增广路, 但与 EK 算法不同的是 Dinic 算法并不是每次 bf ...

最新文章

  1. 网络***技术开篇——SQL Injection
  2. 初学者python用哪个版本好-什么是Python?初学者应该学python哪个版本?
  3. 创建一个dynamics CRM workflow (三) - Creating Configuration Entity for Custom Workflow
  4. linux自动对齐命令,linux查看硬盘4K对齐方法
  5. 【git学习】git管理本地项目
  6. 百度母婴技术团队—基于Reactjs实现webapp #1
  7. 【译】Introduction to Byteball — Part 1: Why?
  8. Ralink5350开发环境搭建
  9. 决策树 算法原理及代码
  10. spark的外排:AppendOnlyMap与ExternalAppendOnlyMap
  11. paip.spring 获取bean getBean 没有beanid的情况下
  12. 视频教程 | 3D 跑酷小游戏实战开发(上)
  13. 京东商城网上购物登录
  14. 域名dns解析IP 与 本机IP 不匹配 是否继续安装
  15. 如何通俗的理解机器学习中的VC维、shatter和break point?
  16. 怎样批量将图片转成PDF格式?图片转换PDF操作方法
  17. python如何筛选excel重复_老板让我从上千个Excel中筛选数据,利用Python分分钟解决!...
  18. java简单冒泡排序代码,跳槽大厂必看!
  19. iOS之苹果和百度地图的使用
  20. 2019年中国社交电商行业市场分析:社交电商巨头已浮出水面

热门文章

  1. 如果用户访问一个不存在的地址呢?
  2. Spring框架的前世今生以及对Spring的宏观认识
  3. 静态方法-应用场景和定义方式
  4. multiprocessing.manager管理的对象需要加锁吗_iOS内存管理布局-理论篇
  5. 【报错笔记】数据类型转换时报错:Request processing failed;nested exception is java.lang.NumberFormatException:...
  6. WEB 实时推送技术总结
  7. HSRP双机热备工作原理与配置
  8. chapter3.1封装和解构
  9. 人工智能化发展已经到了哪一步?
  10. ubuntu下安装mongodb