Pagini recente » Cod sursa (job #3125125) | Cod sursa (job #3278413) | Cod sursa (job #2312290) | Cod sursa (job #861677) | Cod sursa (job #917913)
Cod sursa(job #917913)
#include <fstream>
#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <string.h>
#include <iomanip>
using namespace std;
const string file = "maxflow";
const string infile = file + ".in";
const string outfile = file + ".out";
#define MAXN 1002
#define INF 1<<29
vector<int> G[MAXN];
int Rezidual[MAXN][MAXN];
int Flux[MAXN][MAXN];
int BfsParrent[MAXN];
bool viz[MAXN];
int FMax;
int N;
int M;
void citire()
{
ifstream fin(infile.c_str());
fin >> N >> M;
for(int i = 0; i < M; i++)
{
int x, y, c;
fin >> x >> y >> c;
G[x].push_back(y);
G[y].push_back(x);
Rezidual[x][y] += c;
}
fin.close();
}
bool BFS()
{
memset(BfsParrent, 0, sizeof(BfsParrent));
memset(viz, 0, sizeof(viz));
queue<int> q;
q.push(1);
viz[1] = true;
while(q.empty() == false)
{
int current = q.front();
q.pop();
if(current == N)
return true;
for (vector<int>::iterator itr = G[current].begin();
itr != G[current].end();
itr++)
{
if(viz[*itr] == false && Flux[current][*itr] != Rezidual[current][*itr])
{
viz[*itr] = true;
BfsParrent[*itr] = current;
q.push(*itr);
}
}
}
return false;
}
void solve()
{
while(BFS())
{
for (vector<int>::iterator itr = G[N].begin();
itr != G[N].end();
itr++)
{
int fmin = INF;
if(BfsParrent[*itr] != 0)
{
BfsParrent[N] = *itr;
for(int current = N; current != 1; current = BfsParrent[current])
{
fmin = min(fmin, Rezidual[BfsParrent[current]][current] - Flux[BfsParrent[current]][current]);
}
if(fmin != 0)
{
for(int current = N; current != 1; current = BfsParrent[current])
{
Flux[BfsParrent[current]][current] += fmin;
Flux[current][BfsParrent[current]] -= fmin;
}
FMax += fmin;
}
}
}
}
}
void afisare()
{
ofstream fout(outfile.c_str());
fout << FMax << "\n";
fout.close();
}
int main()
{
citire();
solve();
afisare();
}