1. 程式人生 > 其它 >最大流模板

最大流模板

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define gc(a) a=getchar()
 5 #define pc(a) putchar(a)
 6 ll read(){
 7     char c;ll x=0;bool flag=0;gc(c);
 8     while(c<'0'||c>'9'){if(c=='-') flag=1;gc(c);}
 9     while(c>='0'&&c<='9'){x=(x<<3
)+(x<<1)+(c^48),gc(c);} 10 return flag?-x:x; 11 } 12 void pr(ll x){ 13 if(x<0){x=-x;pc('-');} 14 if(x>9) pr(x/10); 15 pc(x%10+48); 16 } 17 18 const int maxn = 2050; 19 const int maxm = 10050; 20 const int INF = 2147483647; 21 long long ans = 0,les[maxn]; 22 int cnt = -1; 23 int head[maxn];
24 int s,t,n,m; 25 int pre[maxn]; 26 bool vis[maxn]; 27 queue<int> que; 28 29 struct Edge{ 30 int v,nex; 31 long long c; 32 33 Edge(){ 34 this->v = 0; 35 this->nex = -1; 36 this->c = 0; 37 } 38 Edge(int v,int nex,long long c): 39 v(v),nex(nex),c(c){}
40 }edge[maxm * 2]; 41 42 void edgepush(int u,int v,long long c){ 43 edge[++cnt] = Edge(v,head[u],c); 44 head[u] = cnt; 45 edge[++cnt] = Edge(u,head[v],0); 46 head[v] = cnt; 47 } 48 49 bool bfs(){ 50 int u,v; 51 for(int i = 1;i <= n;i++) 52 vis[i] = 0; 53 while(!que.empty()) que.pop(); 54 que.push(s); 55 les[s] = INF; 56 vis[s] = 1; 57 while(!que.empty()){ 58 u = que.front(); 59 que.pop(); 60 for(int i = head[u]; ~i ;i = edge[i].nex){ 61 v = edge[i].v; 62 if(vis[v] || !edge[i].c) continue; 63 pre[v] = i; 64 les[v] = min(les[u],edge[i].c); 65 if(v == t) return 1; 66 que.push(v); 67 vis[v] = 1; 68 } 69 } 70 return 0; 71 } 72 73 void EK(){ 74 while(bfs()){ 75 int ite = 0; 76 ans += les[t]; 77 for(int i = t;i != s;i = edge[pre[i]^1].v){ 78 ite = pre[i]; 79 edge[ite].c -= les[t]; 80 edge[ite^1].c += les[t]; 81 } 82 } 83 } 84 int main(){ 85 int u,v; 86 long long c; 87 n = read(),m = read(), 88 s = read(),t = read(); 89 for(int i = 1;i <= n;i++) 90 head[i] = -1; 91 for(int i = 0;i < m;i++){ 92 u = read(), 93 v = read(), 94 c = read(); 95 edgepush(u,v,c); 96 } 97 EK(); 98 pr(ans); 99 }