Pagini recente » Cod sursa (job #542943) | Cod sursa (job #2263946) | Statistici Oprea Mihai (mihaio07) | Cod sursa (job #984909) | Cod sursa (job #1940694)
#include <vector>
#include <cstdio>
#include <bitset>
#include <queue>
#define Nmax 1005
#define Capmax 110000
using namespace std;
queue <int> coada;
vector <int > graf[Nmax];
int flux[Nmax][Nmax];
int capacitate[Nmax][Nmax];
int n,m;
int tata[Nmax];
bitset <Nmax> viz;
void read()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
int x,y,c;
scanf("%d %d",&n,&m);
for(int i = 0 ; i < m ; i++)
{
scanf("%d %d %d",&x,&y,&c);
graf[x].push_back(y);
graf[y].push_back(x);
capacitate[x][y] = c;
}
}
bool bfs(int start)
{
coada.push(start);
viz[start] = true;
while(!coada.empty())
{
int nod = coada.front();
coada.pop();
if( nod == n)
continue;
for(vector <int> :: iterator it = graf[nod].begin() ; it!= graf[nod].end(); it++)
{
if(viz[*it] == false &&capacitate[nod][*it] > flux[nod][*it])
{
viz[*it] = true;
tata[*it] = nod;
coada.push(*it);
}
}
}
return viz[n];
}
void rezolvare()
{
int flux_total = 0;
while(bfs(1))
{
for(vector <int> :: iterator it = graf[n].begin() ; it != graf[n].end(); it++)
{
if(viz[*it] == 1 && capacitate[*it][n] > flux[*it][n])
{
int marire = 110000;
int aux = n;
while(aux != 1)
{
if(marire > capacitate[tata[aux]][aux] - flux[tata[aux]][aux])
marire = capacitate[tata[aux]][aux] - flux[tata[aux]][aux];
aux = tata[aux];
}
flux_total += marire;
aux = n;
while(aux != 1)
{
flux[tata[aux]][aux] += marire;
flux[aux][tata[aux]] -= marire;
aux = tata[aux];
}
}
}
viz.reset();
for(int i = 1 ; i <= n ; i++)
tata[i] = 0;
}
printf("%d",flux_total);
}
int main()
{
read();
rezolvare();
return 0;
}