Pagini recente » Monitorul de evaluare | Cod sursa (job #1566007) | Cod sursa (job #1663347) | Cod sursa (job #844813) | Cod sursa (job #2860843)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m;
struct edge
{
short int tata;
short int nod;
int c;
int f;
};
vector<edge> graf[1005];
bool viz[1005];
std::vector<edge>::iterator tata[1005];
bool BFS()
{
/// sursa e 1
/// final e n
queue<std::vector<edge>::iterator> que;
memset(viz, false, 1004);
viz[1] = true;
for(std::vector<edge>::iterator i = graf[1].begin(); i < graf[1].end(); i++)
{
if(i->f < i->c)
{
que.push(i);
}
}
while(!que.empty())
{
std::vector<edge>::iterator act;
act = que.front();
que.pop();
tata[act->nod] = act;
if(act->nod == n)
{
return true;
}
for(std::vector<edge>::iterator i = graf[act->nod].begin(); i < graf[act->nod].end(); i++)
{
if(!viz[i->nod] && i->f < i->c)
{
/// il vizitam
viz[i->nod] = true;
que.push(i);
}
}
}
return false;
}
int main()
{
fin >> n;
fin >> m;
edge cache;
cache.f = 0;
int x, y ,z;
for(int i = 0; i < m; i++)
{
fin >> x >> y >> z;
cache.tata = x;
cache.c = z;
cache.nod = y;
graf[x].push_back(cache);
}
int maxflow = 0;
while(BFS())
{
std::vector<edge>::iterator act;
act = tata[n];
int minim = 2e9;
if(act->c - act->f < minim)
{
minim = act->c - act->f;
}
while(act->tata != 1)
{
act = tata[act->tata];
if(act->c - act->f < minim)
{
minim = act->c - act->f;
}
}
maxflow += minim;
act = tata[n];
act->f += minim;
while(act->tata != 1)
{
act = tata[act->tata];
act->f += minim;
}
}
fout << maxflow;
return 0;
}