网络流模板(Dinic)

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<cstdlib>
 7 #include<vector>
 8 using namespace std;
 9 typedef long long ll;
10 typedef long double ld;
11 typedef pair<int,int> pr;
12 const double pi=acos(-1);
13 #define rep(i,a,n) for(int i=a;i<=n;i++)
14 #define per(i,n,a) for(int i=n;i>=a;i--)
15 #define Rep(i,u) for(int i=head[u];i;i=Next[i])
16 #define clr(a) memset(a,0,sizeof(a))
17 #define pb push_back
18 #define mp make_pair
19 #define fi first
20 #define sc second
21 #define pq priority_queue
22 #define pqb priority_queue <int, vector<int>, less<int> >
23 #define pqs priority_queue <int, vector<int>, greater<int> >
24 #define vec vector
25 ld eps=1e-9;
26 ll pp=1000000007;
27 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
28 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
29 void fre() { freopen("c://test//input.in", "r", stdin); freopen("c://test//output.out", "w", stdout); }
30 //void add(int x,int y,int z){ v[++e]=y; next[e]=head[x]; head[x]=e; cost[e]=z; }
31 int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
32 ll read(){ ll ans=0; char last=‘ ‘,ch=getchar();
33 while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar();
34 while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar();
35 if(last==‘-‘)ans=-ans; return ans;
36 }
37 #define M 1000
38 #define N 1000
39 const int INF=1<<30;
40 int head[N],level[N],q[N],e,n,m;
41 struct E_node{
42     int v,f,Next;
43 }edge[M];
44 void add(int x,int y,int z){
45     edge[++e].v=y; edge[e].f=z; edge[e].Next=head[x]; head[x]=e;
46     edge[++e].v=x; edge[e].f=0; edge[e].Next=head[y]; head[y]=e;
47 }
48 int bfs(int s,int t){
49     memset(level,0,sizeof(level));
50     level[s]=1;
51     int h=0,t_=1; q[h]=s;
52     while (h<t_){
53         int x=q[h++];
54         if (x==t) return 1;
55         for (int i=head[x];i;i=edge[i].Next){
56             int v=edge[i].v,f=edge[i].f;
57             if (!level[v] && f>0){
58                 level[v]=level[x]+1;
59                 q[t_++]=v;
60             }
61         }
62     }
63     return 0;
64 }
65 int dfs(int u,int maxf,int t){
66     if (u==t) return maxf;
67     int ret=0;
68     for (int i=head[u];i;i=edge[i].Next){
69         int v=edge[i].v,f=edge[i].f;
70         if (level[v]==level[u]+1 && f>0){
71             int Min=min(maxf-ret,f);
72             f=dfs(v,Min,t);
73             edge[i].f-=f;
74             edge[i^1].f+=f;
75             ret+=f;
76             if (ret==maxf) return ret;
77         }
78     }
79     return ret;
80 }
81 int Dinic(int s,int t){
82     int ans=0;
83     while (bfs(s,t)) ans+=dfs(s,INF,t);
84     return ans;
85 }
86 int main(){
87     n=read(),m=read();
88     for (int i=1;i<=n;i++){
89         int x=read(),y=read(),c=read();
90         add(x,y,c);
91     }
92     printf("%d\n",Dinic(1,m));
93     return 0;
94 } 
时间: 2024-10-13 12:55:28

网络流模板(Dinic)的相关文章

(网络流 模板 Dinic) Drainage Ditches --POJ --1273

链接: http://poj.org/problem?id=1273 代码: #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; const int MAXN = 1005; const int oo = 1e9+7; struct Edge { int v, flow, next; }edge[MAXN]; int Hea

Kuangbin网络流模板

Kuangbin网络流模板. const int maxn=20010; const int maxm=200010; const double INF=1e20; const double eps=1e-8; struct Edge{ int to,next; double cap,flow; }edge[maxm],tmpG[maxm]; int n,tot,toth,totv; int head[maxn],tmph[maxn]; int gap[maxn],dep[maxn],cur[m

[知识点]网络流之Dinic算法

// 此博文为迁移而来,写于2014年2月6日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vrg4.html 今天我们来谈谈网络流之Dinic算法.这种算法相比Edmond-Karp算法,更加快速,更加常用.还记得EK吗?每次为了防止流量堵塞,必须进行多次BFS/DFS,非常费时间.而Dinic大叔非常机智的发明了Dinic算法,让这个问题得以解决. Dinic的核心内容是:反复进行BFS绘制出层次图,和DFS进行

POJ 2391 Ombrophobic Bovines (二分,最短路径,网络流sap,dinic,预留推进 )

Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14019   Accepted: 3068 Description FJ's cows really hate getting wet so much that the mere thought of getting caught in the rain makes them shake in their hooves. They h

HDU 4280 Island Transport(网络流模板)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4280 Problem Description In the vast waters far far away, there are many islands. People are living on the islands, and all the transport among the islands relies

网络流模板 NetworkFlow

身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB Japanese version is here Maximum Flow A flow network is a directed graph which has a  and a . In a flow network, each edge has a capacity . Each edge

算法复习——网络流模板(ssoj)

题目: 题目描述 有 n(0<n<=1000)个点,m(0<m<=1000)条边,每条边有个流量 h(0<=h<35000),求从点 start 到点 end 的最大流. 输入格式 第一行:4 个整数,分别是 n,m,start,end .接下来有 m 行,每行四个三个整数 a,b,h,分别表示 a 到 b,流量为 h 的一条边. 输出格式 输出从点 start 到点 end 的最大流. 样例数据 1 输入 [复制] 7 14 1 7 1 2 5 1 3 6 1 4 5

上下界的网络流模板

上下界网络流问题对于每一条边.都有流量上下限的限制 而普通的网络流就只有上限限制 下面分别给出几种经典上下界网络流问题的模板 参考博文Ⅰ.参考博文Ⅱ 1.无源汇的上下界可行流 实际也就是能否找出一个循环流.使得每个点的流入总流量 == 流出总流量 对于原图的每一条边在网络流中容量应当为 (上界 - 下界) 而后计算每个点流入流量的下界总和记为 in .流出流量的下界总和记为 out 抽象出超级源汇 ss 与 tt 对于原图中的每一个点 如果 in - out > 0 则 ss 与这个点连边.容量

hdu4280网络流之dinic

这题就是个模板题,不过我是第一次写dinic,好久没用链式前向星又不会了... 时间:9126ms #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #incl