网络最大流 dinic算法

一句话题意:给出一个网络图,以及其源点和汇点,求出其网络最大流

//dinic算法;
//时间复杂度O(V^2E);
#include<bits/stdc++.h>
#define inf 999999
#define maxn 200000
using namespace std;
int n,m,s,t;
int ans=0;

struct Edge
{
   int to,next,w;
};
struct Edge edge[maxn];
int head[maxn],val[maxn],pre[maxn];
int level[maxn];
int cnt=0;

void add(int u,int v,int w)//前向星储存边
{
    edge[cnt].to=v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}

int bfs(int s,int t)
{
    queue<int> q;
    q.push(s);
	memset(level,-1,sizeof(level));//一定要从-1开始储存,如果从0开始存的话由于数组本身就是0,会造成死循环!!
	level[s]=0;
   while(!q.empty())
   {
     int j=q.front();q.pop();
     for(int i=head[j];~i;i=edge[i].next)
     {
	    int v=edge[i].to;
	    if(level[v]==-1&&edge[i].w)//染色,广搜求出到达每个点的步数
	    {
		   level[v]=level[j]+1;
		   q.push(v);
		}
	 }
   }
   return (level[t]==-1) ? 0 : 1;//如果不能达到t就是没有增广路,就不进行查找
}

int dfs(int u,int flow,int v)
{
	  if(u==v)
	    return flow;
	  int rest=0;
	  for(int i=head[u];~i;i=edge[i].next)
	  {
	     int j=edge[i].to;
	     if(level[u]+1==level[j]&&edge[i].w)
	     {
		     int flo=dfs(j,min(edge[i].w,flow-rest),v);
		     rest+=flo;
			 edge[i].w-=flo;
		     edge[i^1].w+=flo;//如果i=0,则去i+1如果i=1则取0,总之是取反向边
		 }
	  }
	  if(!rest)
	    level[u]=-1;
	  return rest;
}

int main()
{
	int u,v,w;
	memset(head,-1,sizeof(head));
	cin>>n>>m>>s>>t;
	for(int i=0;i<m;i++)//注意从0开始储存,否则会发生错误
	{
	   cin>>u>>v>>w;
	   add(u,v,w);//s->t存到2k
	   add(v,u,0);//t->s存到2k-1
	}
	while(bfs(s,t))
	   while(int tmp=dfs(s,inf,t))
	     ans+=tmp;
	cout<<ans<<endl;
    return 0;
}
时间: 2024-10-11 16:25:11

网络最大流 dinic算法的相关文章

HDU ACM 3572 Task Schedule 网络最大流-&gt;dinic算法

分析: 建图:每个任务和每一天分别看做一个点,添加源和汇点.源点和每个任务连一条边,每天边的容量为完成对应任务所需处理次数.若第i个任务能够在Si至Ei天处理,则由该任务向这些天分别连一条边,容量为1,表示此任务每天只能被处理一次.最后,每一天分别连一条边到汇点,容量为机器数M,即每天可以处理M个任务.若求出的最大流等于所有任务需要处理的次数之和,说明能完成任务:否则,不能. #include<iostream> #include<vector> #include<queue

【算法】网络最大流 Dinic

Dinic的大体思路是和EK差不多的(其实很多算法的大体思路都一样),只不过Dinic在每次寻找增广路时先bfs一下,给每个点都加上一个等级,而规定:只有等级相邻的两个点之间才能走,那么在dfs时就会减掉很多无用因此不必要的道路 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<queue> 6 using na

POJ 3469.Dual Core CPU 最大流dinic算法模板

Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 24830   Accepted: 10756 Case Time Limit: 5000MS Description As more and more computers are equipped with dual core CPU, SetagLilb, the Chief Technology Officer of TinySoft C

【转】网络最大流——EK算法详解

原文  http://blog.csdn.net/a1dark/article/details/11177907 EdmondsKarp算法,简称EK算法,O(m^2n) 因为是初学教程,所以我会尽量避免繁杂的数学公式和证明.也尽量给出了较为完整的代码.本文的目标群体是网络流的初学者,尤其是看了各种NB的教程也没看懂怎么求最大流的小盆友们.本文的目的是,解释基本的网络流模型,最基础的最大流求法,即bfs找增广路法,也就是EK法,全名是Edmond-Karp,其实我倒是觉得记一下算法的全名和来历可

网络流最大流——dinic算法

前言 网络流问题是一个很深奥的问题,对应也有许多很优秀的算法.但是本文只会讲述dinic算法 最近写了好多网络流的题目,想想看还是写一篇来总结一下网络流和dinic算法以免以后自己忘了... 网络流问题简述 一个很普遍的例子就是--你家和自来水厂之间有许多中转站,中转站又由一些水管连接着.我们假设自来水厂的供水是无限的,并且中转站内能存储的水量也是无限的,但是管道有宽又窄,很显然管道内的流量必须小于等于管道的承载范围(否则管道就被撑爆了),那么问题就是要你求出你家最多能收到多大流量的水. emm

hdu-3572 Task Schedule---最大流判断满流+dinic算法

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3572 题目大意: 给N个任务,M台机器.每个任务有最早才能开始做的时间S,deadline E,和持续工作的时间P.每个任务可以分段进行,但是在同一时刻,一台机器最多只能执行一个任务. 问存不存在可行的工作时间. 解题思路: 由于时间<=500且每个任务都能断断续续的执行,那么我们把每一天时间作为一个节点来用网络流解决该题. 建图: 源点s(编号0), 时间1-500天编号为1到500, N个任务

最大流 Dinic算法

Ford-Fulkerson算法是通过深度优先搜索寻找增广路,并沿着它增广. 与之相对,Dinic算法总是寻找最短的增广路,并沿着它增广.因为最短增广路的长度在增广过程中始终不会变短,所以无需每次都通过宽度预先搜索来寻找最短增广路. 我们可以先进行一次宽度优先搜索,然后考虑由进距离顶点指向远距离顶点的边所组成的分层图,在上面进行深度优先搜索寻找最短增广路. 如果在分层图上找不到新的增广路,则说明最短增长路的长度确实边长了,或不存在增广路,于是重新通过宽度优先搜索构造新的分层图.每一步构造分层图的

POJ 3281 Dining 最大流 Dinic算法

Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10768   Accepted: 4938 Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has cooked fabulo

POJ 1149 PIGS (网络最大流 Dinic 建对图你就赢了)

PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17598   Accepted: 7977 Description Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlock any pighouse because he doesn't have the keys. Customers come t