Pagini recente » Cod sursa (job #3166901) | Cod sursa (job #573580) | Cod sursa (job #537470) | Cod sursa (job #870333) | Cod sursa (job #2654507)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream si("maxflow.in");
ofstream so("maxflow.out");
const int inf=1000000000;
vector<int> v[1010];
queue<int> q;
bitset<1005> vaz;
int cap[1005][1005], flow[1005][1005], tata[1005], dest;
int bfs() {
for(int i=2; i<=dest; i++)
vaz[i]=0;
q.push(1);
vaz[1]=1;
int nod;
while(!q.empty()) {
nod=q.front();
q.pop();
vector<int>::iterator it;
for(it=v[nod].begin(); it!=v[nod].end(); it++) {
if(!vaz[*it]&&cap[nod][*it]>flow[nod][*it]) {
vaz[*it]=1;
tata[*it]=nod;
if(*it!=dest)
q.push(*it);
}
}
}
return vaz[dest];
}
int main() {
int n, m;
si>>n>>m;
dest=n;
int a, b;
for(int i=0; i<m; ++i) {
si>>a>>b;
si>>cap[a][b];
v[a].push_back(b);
v[b].push_back(a);
}
int s, sol=0;
while(bfs()) {
vector<int>::iterator it;
for(it=v[dest].begin(); it!=v[dest].end(); it++)
if(vaz[*it]&&cap[*it][dest]>flow[*it][dest]) {
tata[dest]=*it;
s=inf;
for(int i=dest; i!=1; i=tata[i])
s=min(s, cap[tata[i]][i]-flow[tata[i]][i]);
for(int i=dest; i!=1; i=tata[i]) {
flow[tata[i]][i]+=s;
flow[i][tata[i]]-=s;
}
sol+=s;
}
}
so<<sol<<'\n';
return 0;
}