Pagini recente » Cod sursa (job #104066) | Cod sursa (job #1772600) | Cod sursa (job #504043) | Cod sursa (job #1477568) | Cod sursa (job #2574764)
#include <bits/stdc++.h>
#define oo 0x3f3f3f3f
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m, x, y, cap;
int C[1005][1005];
int F[1005][1005];
int TT[1005];
bool viz[1005];
int flow, flmin;
vector<int> graf[1001];
void Read()
{
f>>n>>m;
for(int i = 1;i <= m;++i)
{
f>>x>>y>>cap;
graf[x].push_back(y);
graf[y].push_back(x);
C[x][y] = cap;
}
}
bool BFS()
{
memset(viz, false, sizeof(viz));
viz[1] = true;
queue<int> q;
q.push(1);
while(!q.empty())
{
int nod = q.front();
q.pop();
if(nod == n) continue;
for(vector<int>::iterator it = graf[nod].begin();it != graf[nod].end();++it)
{
if(C[nod][*it] == F[nod][*it] || viz[*it]) continue;
viz[*it] = true;
q.push(*it);
TT[*it] = nod;
}
}
return viz[n];
}
int main()
{
Read();
for(;BFS();)
{
for(vector<int>::iterator it = graf[n].begin();it != graf[n].end();++it)
{
int nod = *it;
if(C[nod][n] == F[nod][n] || !viz[nod]) continue;
TT[n] = *it;
flmin = oo;
for(nod = n;nod != 1;nod = TT[nod])
flmin = min(flmin, C[TT[nod]][nod] - F[TT[nod]][nod]);
if(flmin == 0) continue;
for(nod = n; nod != 1; nod = TT[nod])
{
F[TT[nod]][nod] += flmin;
F[nod][TT[nod]] -= flmin;
}
flow += flmin;
}
}
g<<flow<<'\n';
return 0;
}