最大流模板(poj3469)

代码:

#include <algorithm>

#include <iostream>

#include <sstream>

#include <cstdlib>

#include <cstring>

#include <iomanip>

#include <cstdio>

#include <string>

#include <bitset>

#include <vector>

#include <queue>

#include <stack>

#include <cmath>

#include <list>

#include <map>

#include <set>

#define sss(a,b,c) scanf("%d%d%d",&a,&b,&c)

#define mem1(a) memset(a,-1,sizeof(a))

#define mem(a) memset(a,0,sizeof(a))

#define ss(a,b) scanf("%d%d",&a,&b)

#define s(a) scanf("%d",&a)

#define INF 0x3f3f3f3f

#define w(a) while(a)

#define PI acos(-1.0)

#define LL long long

#define eps 10E-9

//#define N 100010<<1

#define mod 1000000000+7

using namespace std;

void mys(int& res)

{

int flag=0;

char ch;

while(!(((ch=getchar())>=‘0‘&&ch<=‘9‘)||ch==‘-‘))

if(ch==EOF)  res=INF;

if(ch==‘-‘)  flag=1;

else if(ch>=‘0‘&&ch<=‘9‘)  res=ch-‘0‘;

while((ch=getchar())>=‘0‘&&ch<=‘9‘)  res=res*10+ch-‘0‘;

res=flag?-res:res;

}

void myp(int a)

{

if(a>9)

myp(a/10);

putchar(a%10+‘0‘);

}

/********************the end of template********************/

#define maxn 20010

#define maxm 1000000

struct Eg{

int to;

int next;

int f;

}E[maxm];

int V[maxn],num;

int N,M;

void add(int u,int v,int c){

E[num].to=v;

E[num].f=c;

E[num].next=V[u];

V[u]=num++;

E[num].to=u;

E[num].f=0;

E[num].next=V[v];

V[v]=num++;

}

int level[maxn];

int qu[maxn];

bool BFS(int s,int t){

int i,iq=0;

for(i=0;i<=t;i++) level[i]=0;

int u,v,e;

qu[iq++]=s;

level[s]=1;

for(i=0;i<iq;i++){

u=qu[i];

if(u==t) return true;

for(e=V[u];e!=-1;e=E[e].next){

v=E[e].to;

if(!level[v]&&E[e].f>0)

{

level[v]=level[u]+1;

qu[iq++]=v;

}

}

}

return false;

}

int cur[maxn];

int dfs(int u,int maxf,int t){

if(u==t||maxf==0) return maxf;

int ret=0,f,e,v;

for(e=cur[u];e!=-1;e=E[e].next){// 当前弧优化

v=E[e].to;

if(E[e].f>0&&level[u]+1==level[v]){

f= dfs(v,min(maxf,E[e].f),t);

E[e].f-=f;

E[e^1].f+=f;

maxf-=f;

ret+=f;

cur[u]=e;

if(maxf==0) break;

}

}

return ret;

}

int Dinic(int s,int t){

int flow=0;

while(BFS(s,t)){

for(int i=0;i<=t;i++)

cur[i]=V[i];

flow+=dfs(s,mod,t);

}

return flow;

}

int main(){

int a,b,w;

w(ss(N,M)!=EOF){

for(int i=0;i<=N+1;i++) V[i]=-1;

num=0;

for(int i=1;i<=N;i++){

ss(a,b);

add(0,i,a);

add(i,N+1,b);

}

w(M--){

sss(a,b,w);

add(a,b,w);

add(b,a,w);

}

printf("%d\n",Dinic(0,N+1));

}

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 12:16:08

最大流模板(poj3469)的相关文章

hdu4292 Food 最大流模板题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4292 题意:水和饮料,建图跑最大流模板. 我用的是学长的模板,最然我还没有仔细理解,不过这都不重要直接贴就行了. 下面是AC代码,以后就当做最大流的模板来用了. 代码: #include<cstdio> #include<iostream> using namespace std; const int oo=1e9; const int mm=2e5+5; const int mn=1

POJ2135Farm Tour(最小费用最大流模板)

题目链接:http://poj.org/problem?id=2135 题意:农场主想从1到n,然后从n到1,每条边最多走一次,不能走重复的路,问最短距离是多少. 建图:取超级源点s,并与房子连一条边,容量为2,费用为0:取barn与超级汇点 t 的边的容量为2,费用为0 房子与barn的费用为距离,容量为1 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring>

hdu 3549 Flow Problem(最大流模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the maximum flow for the weighted directed graph. Input The first line of input

[ACM] hdu 3549 Flow Problem (最大流模板题)

Flow Problem Problem Description Network flow is a well-known difficult problem for ACMers. Given a graph, your task is to find out the maximum flow for the weighted directed graph. Input The first line of input contains an integer T, denoting the nu

Drainage Ditches---hdu1532(最大流, 模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 最大流模板题: EK:(复杂度为n*m*m); #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; #define INF 0xfffffff #define N 220 int maps[N][N], pre[N], a

最大流模板(2)

#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include <map> #include <set> #include <alg

POJ2135 最小费用最大流模板题

练练最小费用最大流 此外此题也是一经典图论题 题意:找出两条从s到t的不同的路径,距离最短. 要注意:这里是无向边,要变成两条有向边 #include <cstdio> #include <cstring> #define MAXN 1005 #define MAXM 10005 #define INF 0x3f3f3f3f struct Edge { int y,c,w,ne;//c容量 w费用 }e[MAXM*4]; int n,m,x,y,w; int s,t,Maxflow

最大流模板(Dinic)

最大流模板: #include<stdio.h> #include<iostream> using namespace std; const int oo=1e9; /**oo 表示无穷大*/ const int mm=111111111; /**mm 表示边的最大数量,记住要是原图的两倍,在加边的时候都是双向的*/ const int mn=999; /**mn 表示点的最大数量*/ int node,src,dest,edge; /**node 表示节点数,src 表示源点,d

poj 2135 Farm Tour (最小费用最大流模板)

网络流的费用: 在实际应用中,与网络流有关的问题,不仅涉及流量,而且还有费用的因素.网络的每一条边(v,w)除了给定容量cap(v,w)外,还定义了一个单位流量费用cost(v,w) 最小费用最大流问题 给定网络G,要求G的一个最大用流flow,使流的总费用最小. 求解MCMF问题的算法: 最小费用最大流最常用和基本的算法我们可以称它为最小费用路算法,其思想与求最大流的增广路算法类似,不断在残流网络中寻找从源s到汇t的最小费用路,即残流网络中从s到t的以费用为权的最短路,然后沿最小费用路增流,直

网路流模板+总结

如此繁复多样的一类问题,就先从模板开始吧 1.最大流算法 模板题:https://www.luogu.org/problemnew/show/P3376 以下所有模板皆以上述问题为准 (1)FF算法(Ford-Fulkerson) 这便是最基础的一种增广路算法. 而所有增广路算法都使用了一种重要的技巧:对所有edge.cap>0的边构造反向边rev(e). 而在我个人看来,构造反向边的精妙之处就在于它使得两个看上去不相干的较难处理的操作化为了一个符合dfs基本法的操作,即所谓的"退流&qu