网络流-最大流 Dinic模板

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define MP make_pair
 6 #define PB push_back
 7 #define ls first
 8 #define rs second
 9 typedef long long LL;
10 typedef pair<int,int> PII;
11 const double eps=1e-8;
12 const double pi=acos(-1.0);
13 const int K=1e5+7;
14 const int mod=1e9+7;
15
16 vector<pair<int,int>>mp[K];
17 int n,m,cnt,flow[K*2],deep[K],cur[K];
18
19 int bfs(int s,int t)
20 {
21     queue<int>q;
22     memset(deep,0,sizeof deep);
23     q.push(s),deep[s]=1;
24     while(!q.empty())
25     {
26         int u=q.front();q.pop();
27         for(auto &it:mp[u])
28         if(!deep[it.ls]&&flow[it.rs])
29         {
30             deep[it.ls]=deep[u]+1;
31             q.push(it.ls);
32             if(it.ls==t)
33                 return 1;
34         }
35     }
36     return 0;
37 }
38 int dfs(int x,int d,int t)
39 {
40     if(x==t) return d;
41     for(int i=cur[x];i<mp[x].size();cur[x]=++i)
42     {
43         int u=mp[x][i].ls,v=mp[x][i].rs;
44         if(deep[u]==deep[x]+1&&flow[v])
45         {
46             int td=min(d,dfs(u,min(d,flow[v]),t));
47             if(!td) continue;
48             flow[v]-=td;
49             flow[v^1]+=td;
50             return td;
51         }
52     }
53     return 0;
54 }
55 int dinic(int s,int t)
56 {
57     int ret=0,d;
58     while(bfs(s,t))
59     {
60         memset(cur,0,sizeof cur);
61         while(d=dfs(s,mod,t))    ret+=d;
62     }
63     return ret;
64 }
65 int main(void)
66 {
67     while(~scanf("%d%d",&m,&n))
68     {
69         cnt=0;
70         memset(mp,0,sizeof mp);
71         for(int i=0,u,v,w;i<m;i++)
72         {
73             scanf("%d%d%d",&u,&v,&w);
74             flow[cnt]=w,flow[cnt+1]=0;
75             mp[u].PB(MP(v,cnt++));
76             mp[v].PB(MP(u,cnt++));
77         }
78         printf("%d\n",dinic(1,n));
79     }
80     return 0;
81 }

原文地址:https://www.cnblogs.com/weeping/p/8783485.html

时间: 2024-10-08 04:25:18

网络流-最大流 Dinic模板的相关文章

网络流--最大流dinic模板

标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 1 #include<stdio.h> //差不多要加这么些头文件 2 #include<string.h> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 const int maxm=150+5; //点的总数 8

POJ训练计划1459_Power Network(网络流最大流/Dinic)

解题报告 这题建模实在是好建,,,好贱,,, 给前向星给跪了,纯dinic的前向星竟然TLE,sad,,,回头看看优化,,, 矩阵跑过了,2A,sad,,, /************************************************************************* > File Name: PowerN.cpp > Author: _nplus > Mail: [email protected] > Time: 2014年07月19日 星期

[POJ 1273] Drainage Ditches &amp; 最大流Dinic模板

Drainage Ditches Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a

网络流最大流——dinic算法

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

【uva 11082】Matrix Decompressing(图论--网络流最大流 Dinic+拆点二分图匹配)

题意:有一个N行M列的正整数矩阵,输入N个前1~N行所有元素之和,以及M个前1~M列所有元素之和.要求找一个满足这些条件,并且矩阵中的元素都是1~20之间的正整数的矩阵.输入保证有解,而且1≤N,M≤20. 解法:这题的图转换得极妙!(*^▽^*)   我们可以发现找到的矩阵需要满足3个条件:1.N行M列:2.各行各列的和:3.各元素的大小.再仔细阅读一次题目,发现题目中提到的2个数字相同——“20”,再想想这是不是有什么玄机.     首先可以找到第3个条件的转化,可以用容量来限制,那么这题用

UESTC 1143 数据传输 网络流 最大流 Dinic

数据传输 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Status 机房里面有m台电脑,n台网线,每条网线都每秒中最多传送的数据量,如今须要你计算从标号为1的电脑传送数据到编号为m的电脑,问一秒内 最多传送多少数据? Input 第1行: 两个用空格分开的整数N(0≤N≤200)和 M(2≤M≤200).N网线的数量,M是电脑的数量. 第二行到第N+1行:

最大流Dinic模板

1 int bfs() 2 { 3 queue<int>q; 4 memset(d,0,sizeof(d)); 5 d[1]=1; 6 q.push(1); 7 while (!q.empty()) 8 { 9 int u=q.front(); 10 q.pop(); 11 for (int i=head[u];i!=-1;i=eage[i].next) 12 { 13 int v=eage[i].v; 14 if (!d[v]&&eage[i].cap>0) 15 {

网络流--最大流ek模板

标准大白书式模板,代码简单但由于效率并不高,所以并不常用,就是这样 1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 const int maxm=150+5; 8 const int INF=0x3f3f3f3f; 9 10 struct edge

网络最大流dinic模板

#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; queue<int>q; int INF=1e9; int n,m,head[10005],cur[10005],ct=1,s,t,d[10005],ans; struct N{ int to,next,w; }edge[200005]; void add(int x