Pagini recente » Cod sursa (job #2177344) | Cod sursa (job #3202509) | Cod sursa (job #1103350) | Cod sursa (job #1446637) | Cod sursa (job #2403887)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cmath>
#include <cstring>
#include <ctime>
#include <unordered_map>
#include <iomanip>
#include <complex>
#include <cassert>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define deb(a) cerr<< #a << "= " << (a)<<"\n";
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int uint;
typedef long double ld;
typedef complex<double> base;
typedef vector<int> vi;
typedef pair<int,int> pii;
template<class T> ostream& operator<<(ostream& stream, const vector<T> v){ stream << "[ "; for (int i=0; i<(int)v.size(); i++) stream << v[i] << " "; stream << "]"; return stream; }
ll fpow(ll x, ll p, ll m){ll r=1; for (;p;p>>=1){ if (p&1) r=r*x%m; x=x*x%m; } return r;}
ll inv(ll a, ll b){ return a<2 ? a : ((a-inv(b%a,a))*b+1)/a%b; }
int gcd(int a, int b){ if (!b) return a; return gcd(b,a%b);}
ll gcd(ll a, ll b){ if (!b) return a; return gcd(b,a%b);}
int N,M,C[1010][1010],F[1010][1010],d[1010],ptr[1010];
vi g[1010];
bool bfs(){
vi q;
q.pb(1);
memset(d,-1,sizeof(d));
d[1] = 0;
for (int i=0; i<(int)q.size(); i++){
int cr = q[i];
for (int nxt : g[cr]){
if (d[nxt]==-1 && F[cr][nxt]<C[cr][nxt]){
d[nxt] = d[cr]+1;
q.pb(nxt);
}
}
}
return d[N]!=-1;
}
int dfs(int x, int vmin){
if (vmin==0) return 0;
if (x==N) return vmin;
for (;ptr[x]<(int)g[x].size(); ptr[x]++){
int nxt = g[x][ptr[x]];
if (d[nxt]==d[x]+1){
int val = dfs(nxt,min(vmin,C[x][nxt]-F[x][nxt]));
if (val>0){
F[x][nxt]+=val;
F[nxt][x]-=val;
return val;
}
}
}
return 0;
}
int dinic(){
int res=0;
while (bfs()){
memset(ptr,0,sizeof(ptr));
int flow = dfs(1,(1<<30));
while (flow)
res+=flow,flow=dfs(1,(1<<30));
}
return res;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
cin >> N >> M;
int i;
for (i=1; i<=M; i++){
int x,y,c;
cin >> x >> y >> c;
g[x].pb(y);
g[y].pb(x);
C[x][y]=c;
}
//cout << "asf\n";
cout << dinic();
}