SPOJ 4110 Fast Maximum Flow (最大流模板)

题目大意:

无向图,求最大流。

算法讨论:

Dinic可过。终于我的常数还是太大。以后要注意下了。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 using namespace std;
 8 typedef long long ll;
 9
10 struct MF{
11   static const int N = 5000 + 5;
12   static const int M = 60000 + 5;
13   static const ll oo = 10000000000000LL;
14
15   int n, m, s, t, tot, tim;
16   int first[N], next[M];
17   int u[M], v[M], cur[N], vi[N];
18     ll cap[M], flow[M], dis[N];
19   int que[N + N];
20
21   void Clear(){
22     tot = 0;tim = 0;
23        for(int i = 1; i <= n; ++ i) first[i] = -1;
24   }
25   void Add(int from, int to, ll cp, ll flw){
26     u[tot] = from; v[tot] = to; cap[tot] = cp; flow[tot] = flw;
27     next[tot] = first[u[tot]];
28     first[u[tot]] = tot;
29     ++ tot;
30   }
31   bool bfs(){
32       ++ tim;
33     dis[s] = 0;vi[s] = tim;
34
35     int head, tail;
36     head = tail = 1;
37     que[head] = s;
38     while(head <= tail){
39         for(int i = first[que[head]]; i != -1; i = next[i]){
40             if(vi[v[i]] != tim && cap[i] > flow[i]){
41                 vi[v[i]] = tim;
42                 dis[v[i]] = dis[que[head]] + 1;
43                     que[++ tail] = v[i];
44                 }
45             }
46             ++ head;
47         }
48        return vi[t] == tim;
49   }
50   ll dfs(int x, ll a){
51     if(x == t || a == 0) return a;
52     ll flw = 0, f;
53     int &i = cur[x];
54     for(i = first[x]; i != -1; i = next[i]){
55       if(dis[x] + 1 == dis[v[i]] && (f = dfs(v[i], min(a, cap[i]-flow[i]))) > 0){
56         flow[i] += f; flow[i^1] -= f;
57           a -= f; flw += f;
58           if(a == 0) break;
59         }
60       }
61     return flw;
62   }
63     ll MaxFlow(int s, int t){
64     this->s = s;this->t = t;
65     ll flw = 0;
66     while(bfs()){
67       for(int i = 1; i <= n; ++ i) cur[i] = 0;
68       flw += dfs(s, oo);
69     }
70     return flw;
71   }
72 }Net;
73 int n, m;
74
75 int main(){
76     int x, y;
77     ll z;
78     scanf("%d%d", &n, &m);
79     Net.n = n;
80     Net.Clear();
81     for(int i = 1; i <= m; ++ i){
82         scanf("%d%d%lld", &x, &y, &z);
83         Net.Add(x, y, z, 0);
84         Net.Add(y, x, z, 0);
85     }
86     printf("%lld\n", Net.MaxFlow(1,Net.n));
87     return 0;
88 }

SPOJ 4110

时间: 2024-10-07 07:35:01

SPOJ 4110 Fast Maximum Flow (最大流模板)的相关文章

SPOJ 4206 Fast Maximum Matching (二分图最大匹配 Hopcroft-Carp 算法 模板)

题目大意: 有n1头公牛和n2头母牛,给出公母之间的m对配对关系,求最大匹配数.数据范围:  1 <= n1, n2 <= 50000, m <= 150000 算法讨论: 第一反应KM直接上,第二反应,KM是O(N^2 * M)的,会T成狗. 第二反应,看看大家是怎么做的.后来发现了一个名字叫 Hopcroft-Carp的二分图最大匹配的算法.可以在O(sqrt(n) * m)的时间内解决二分图的最大匹配问题.非常适合大数据的二分图匹配.所以就学习了一下. 我们知道,普通的匈牙利慢的原

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

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>

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

最大流模板(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的以费用为权的最短路,然后沿最小费用路增流,直