Pagini recente » Cod sursa (job #2908279) | Cod sursa (job #2664029) | Cod sursa (job #1734179) | Cod sursa (job #2892770) | Cod sursa (job #475703)
Cod sursa(job #475703)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define nmax 1025
using namespace std;
const char iname[] = "maxflow.in";
const char oname[] = "maxflow.out";
ifstream fin(iname);
ofstream fout(oname);
vector<int> nod[nmax];
queue<int> Q;
int N, M, i, a, b, c, Cap[nmax][nmax], x, F[nmax][nmax], fmin, flow, y, tata[nmax], viz[nmax];
int BFS()
{
Q.push(1);
memset(viz, 0, sizeof(viz));
while(!Q.empty())
{
x = Q.front();
Q.pop();
if(x == N)
continue;
for(vector<int>::iterator it = nod[x].begin(); it != nod[x].end(); ++it) //merg si adaug vecinii
{
if(F[x][*it] == Cap[x][*it] || viz[*it]) //nu adaug daca nu pot ajunitge la un maxim sau l-am vizitat deja
continue;
Q.push(*it);
viz[*it] = 1;
tata[*it] = x;
}
}
return viz[N]; //ajung la destinatie sau nu ?
}
int main()
{
fin >> N >> M;
for(i = 1; i <= M; i ++)
{
fin >> a >> b >> c;
nod[a].push_back(b);
nod[b].push_back(a);
Cap[a][b] = c;
}
for(flow = 0; BFS();)
{
//merg prin toti vecinii destinatiei si maresc fluxul cu ajutorul tuturor vecinilor frunza ai nodului N (creati in arborele meu BFS)
for(vector<int>::iterator it = nod[N].begin(); it != nod[N].end(); ++ it)
{
if(F[*it][N] == Cap[*it][N] || !viz[*it]) //daca e maxim deja sau nu e vizitat sar peste el (nu ma conduce la drum sau nu mai am ce modifica)
continue;
tata[N] = *it; //altfel continui pe tati sa refac drumul pt a adauga fluxul bun
fmin = 287185781;
for(y = N; y != 1; y = tata[y])
fmin = min(fmin, Cap[tata[y]][y] - F[tata[y]][y]); //minimul dintre diferenta capacitatii si flux = ce pot adauga pt drumul asta
for(y = N; y != 1; y = tata[y])
{
F[tata[y]][y] += fmin; //adaug pe normala
F[y][tata[y]] -= fmin; //scad pe inversa ca sa pot eventual veni pe un drum invers
}
flow += fmin; //adaug fmin (valoarea noua pe care o pot adauga la flux)
}
}
fout << flow;
return 0;
}