Pagini recente » Cod sursa (job #1162332) | Cod sursa (job #1051076) | Cod sursa (job #2120364) | Cod sursa (job #2820863)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int const N = 1001 , inf = (1 << 30);
int n , m , maxflow , niv[N] , viz[N] , t[N];
map<pair<int , int> , int> ind;
struct Node{
int to , w , f;
Node(){
to = w = f;
}
Node(int a , int b , int c){
to = a , w = b , f = c ;
}
};
vector<Node> v[N];
int build(){
queue<int> q;
q.push(1);
for(int i = 2 ; i <= n ; ++ i)
viz[i] = 0;
viz[1] = 1;
while(!q.empty()){
int node = q.front();
q.pop();
for(auto y : v[node])
if(!viz[y.to] && y.w - y.f > 0){
viz[y.to] = 1;
niv[y.to] = 1 + niv[node];
q.push(y.to);
}
}
return viz[n];
}
bool ok;
int dfs(int node , int flow){
if(node == n){
ok = true;
return flow;
}
for(auto &y : v[node]){
if(niv[y.to] == 1 + niv[node] && y.w - y.f > 0){
int now = min(flow , y.w - y.f);
int nf = dfs(y.to , now);
y.f += nf;
v[y.to][ind[make_pair(y.to , node)]].f -= nf;
if(nf)
return nf;
}
}
return 0;
}
int main(){
fin >> n >> m;
for(int i = 1 ; i <= m ; ++ i){
int a , b , c;
fin >> a >> b >> c;
v[a].push_back(Node(b , c , 0));
ind[make_pair(a , b)] = v[a].size() - 1;
v[b].push_back(Node(a , c , c));
ind[make_pair(b , a)] = v[b].size() - 1;
}
while(build()){
ok = false;
int flow = dfs(1 , inf);
while(ok){
ok = false;
maxflow += flow;
flow = dfs(1 , inf);
}
}
fout << maxflow << '\n';
return 0;
}