Pagini recente » Cod sursa (job #2496382) | Cod sursa (job #1056636) | Cod sursa (job #1506741) | Cod sursa (job #2813149) | Cod sursa (job #1938280)
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;
const int nmx = 1002;
const int inf = 0x3f3f3f3f;
int n,m,flux[nmx][nmx],cap[nmx][nmx],tata[nmx],total;
vector <int> g[nmx];
bitset <nmx> viz;
queue <int> q;
void citire()
{
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; ++i)
{
int nod1,nod2;
scanf("%d %d", &nod1, &nod2);
scanf("%d", &cap[nod1][nod2]);
g[nod1].push_back(nod2);
g[nod2].push_back(nod1);
}
}
bool bfs()
{
viz.reset();
viz[1] = true;
q.push(1);
while(not q.empty())
{
int nod = q.front();
q.pop();
if(nod == n)
continue;
for(vector<int>::iterator it = g[nod].begin(); it != g[nod].end(); ++it)
if(not viz[*it] && cap[nod][*it] != flux[nod][*it])
{
viz[*it] = 1;
tata[*it] = nod;
q.push(*it);
}
}
return viz[n];
}
void gasire_drum()
{
while(bfs())
{
for(vector<int>::iterator it = g[n].begin(); it != g[n].end(); ++it)
{
if(not viz[*it] || flux[*it][n] == cap[*it][n])
continue;
tata[n] = *it;
int nod = n, minim = inf;
while(nod > 1)
{
minim = min(minim,cap[tata[nod]][nod] - flux[tata[nod]][nod]);
nod = tata[nod];
}
if(minim == 0)
continue;
total += minim;
nod = n;
while(nod > 1)
{
flux[tata[nod]][nod] += minim;
flux[nod][tata[nod]] -= minim;
nod = tata[nod];
}
}
}
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
citire();
gasire_drum();
printf("%d\n", total);
return 0;
}