Pagini recente » Rating Moise Andrei (AndreiM315) | Cod sursa (job #413066) | Cod sursa (job #1905090) | Cod sursa (job #516155) | Cod sursa (job #316841)
Cod sursa(job #316841)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int N_MAX = 1000;
const int M_MAX = 5000;
const int INF = 0x3f3f3f3f;
struct muchie { int cap, flow; };
int n,m;
vector< pair<int,int> > G[N_MAX];
vector< pair<int,int> > Gr[N_MAX];
muchie VM[M_MAX];
bool view[N_MAX];
int prev[M_MAX];
bool prevIsRev[M_MAX];
inline int getArcSpace ( pair<int,int> &k ) { return VM[k.second].cap - VM[k.second].flow; }
inline int getArcSpace ( int k ) { return VM[k].cap - VM[k].flow; }
inline int getArcFlow ( pair<int,int> &k ) { return VM[k.second].flow; }
inline int getArcFlow ( int k ) { return VM[k].flow; }
bool BF() {
queue< pair<int,int> > Q;
queue<bool> Qr;
fill(view,view+n,false);
view[0] = true;
for (Q.push(make_pair(0,-1)), Qr.push(false); !Q.empty(); Q.pop(), Qr.pop()) {
for (vector< pair<int,int> >::iterator next = G[Q.front().first].begin(); next != G[Q.front().first].end(); ++next) {
if (!view[next->first] && getArcSpace(*next) > 0) {
view[next->first] = true;
prev[next->second] = Q.front().second;
prevIsRev[next->second] = Qr.front();
Q.push(*next);
Qr.push(false);
}
}
for (vector< pair<int,int> >::iterator next = Gr[Q.front().first].begin(); next != Gr[Q.front().first].end(); ++next) {
if (!view[next->first] && getArcFlow(*next) > 0) {
view[next->first] = true;
prev[next->second] = Q.front().second;
prevIsRev[next->second] = Qr.front();
Q.push(*next);
Qr.push(true);
}
}
}
return view[n-1];
}
int maxFlow() {
int flow = 0;
while (BF()) {
for (vector< pair<int,int> >::iterator nod = Gr[n-1].begin(); nod != Gr[n-1].end(); ++nod) {
if (view[nod->first] && getArcSpace(*nod) > 0) {
int push = INF;
bool rev = false;
for (int i = nod->second; i >= 0; i = prev[i], rev = prevIsRev[i])
if (rev) {
if (push > getArcFlow(i))
push = getArcFlow(i);
} else {
if (push > getArcSpace(i))
push = getArcSpace(i);
}
flow += push;
rev = false;
for (int i = nod->second; i >= 0; i = prev[i], rev = prevIsRev[i])
if (rev)
VM[i].flow -= push; else
VM[i].flow += push;
}
}
}
return flow;
}
int main() {
freopen("maxflow.in","rt",stdin);
freopen("maxflow.out","wt",stdout);
scanf("%d %d",&n,&m);
for (int i = 0, a,b,c; i < m; ++i) {
scanf("%d %d %d",&a,&b,&c);
--a; --b;
G[a].push_back(make_pair(b,i));
Gr[b].push_back(make_pair(a,i));
VM[i].cap = c;
VM[i].flow = 0;
}
printf("%d\n",maxFlow());
return 0;
}