Pagini recente » Profil MihaiPirvu | Rating Rafa Ioan (Rafa_Ioan) | Cod sursa (job #323968) | Rating Tranciuc Andrei (LicaSamadaul) | Cod sursa (job #966970)
Cod sursa(job #966970)
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>
///finally
#define Source 1
#define Sink N
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int MAXN = 1005;
const int oo = ((1<<31) - 1);
vector <int> Graph[MAXN], tata(MAXN);
int C[MAXN][MAXN];
int N, M, maxFlow;
inline int bfs()
{
queue <int> Q;
bitset < MAXN > viz;
for(Q.push(Source), viz[Source] = true ; !Q.empty(); Q.pop())
{
int node = Q.front();
if(node == Sink)
continue;
for(int i = Source ; i <= Sink ; ++ i)
if(C[node][i] && !viz[i])
{
Q.push(i);
tata[i] = node;
viz[i] = true;
}
}
return viz[Sink];
}
int main()
{
cin >> N >> M;
for(int i = 1, x, y, z; i <= M ; ++ i)
{
cin >> x >> y >> z;
C[x][y] = z;
Graph[x].push_back(y);
Graph[y].push_back(x);
}
cin.close();
for(maxFlow = 0 ; bfs() ; )
{
for(int i = Source; i < Sink ; ++ i)
if(C[i][Sink])
{
tata[Sink] = i;
int Flow = oo;
for(int j = Sink ; j != Source ; j = tata[j])
if(C [ tata[j] ][j] < Flow)
Flow = C[tata[j]][j];
if( !Flow )
continue;
for(int j = Sink ; j != Source ; j = tata[j])
C[ tata[j] ][j] -= Flow,
C[j][ tata[j] ] += Flow;
maxFlow += Flow;
}
}
cout << maxFlow << "\n";
cout.close();
return 0;
}