Pagini recente » Profil clviu | Cod sursa (job #3357811) | Diferente pentru sandbox intre reviziile 141 si 140 | Cod sursa (job #1755900) | Cod sursa (job #3331287)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int NMAX = 1005;
const int INF = 1e9;
vector<int> adj[NMAX];
int C[NMAX][NMAX];
int F[NMAX][NMAX];
int tata[NMAX];
bool viz[NMAX];
int n,m,x,y,c,flux_maxim = 0;
bool exista_drum_nesaturat(){
memset(viz, 0, sizeof(viz));
queue<int> q;
q.push(1);
viz[1] = 1;
tata[1] = 0;
while(!q.empty()){
int nod = q.front();
q.pop();
for(auto& neigh: adj[nod]){
if(viz[neigh] == 0 && C[nod][neigh] > F[nod][neigh]){
q.push(neigh);
viz[neigh] = 1;
tata[neigh] = nod;
if(neigh == n)
return true;
}
else if(viz[neigh] ==0 && F[neigh][nod] > 0){
q.push(neigh);
viz[neigh] = 1;
tata[neigh] = -nod;
if(neigh == n)
return true;
}
}
}
return false;
}
int main(){
f >> n >> m;
for(int i=0; i<m; i++){
f >> x >> y >> c;
adj[x].push_back(y);
adj[y].push_back(x);
C[x][y] = c;
}
while(exista_drum_nesaturat()){
int delta = INF;
for(int v = n; v != 1;){
int u = tata[v];
if(u > 0){
delta = min(delta, C[u][v]-F[u][v]);
v = u;
}
else{
int real_u = -u;
delta = min(delta, F[v][real_u]);
v = real_u;
}
}
if(delta == 0)
break;
for(int v= n; v!= 1;){
int u = tata[v];
if(u > 0){
F[u][v] += delta;
v = u;
}
else{
int real_u = -u;
F[v][real_u] -= delta;
v = real_u;
}
}
flux_maxim += delta;
}
g << flux_maxim;
return 0;
}