Pagini recente » Cod sursa (job #1314213) | Cod sursa (job #2932864) | Cod sursa (job #2297078) | Cod sursa (job #1793061) | Cod sursa (job #1980931)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define MAXN 1030
using namespace std;
vector<int> lista[MAXN];
int n, m;
bool vizitat[MAXN];
int tata[MAXN];
int flow[MAXN][MAXN], cap[MAXN][MAXN];
void read(){
fstream f("maxflow.in",ios::in);
int a, b, c, i, j;
f >> n >> m;
while(f >> a >> b >> c){
lista[a].push_back(b);
lista[b].push_back(a);
cap[a][b] = cap[a][b] + c;
flow[a][b] = cap[a][b];
}
}
void set_vizitat(){
for(int i = 1;i <= n; ++i)
vizitat[i] = false;
}
int BFS(){
set_vizitat();
vizitat[1] = true;
queue<int> q;
q.push(1);
while(!q.empty()){
int nod = q.front();
int len = lista[nod].size();
q.pop();
for(int i = 0;i < len; ++i)
if(!vizitat[lista[nod][i]] && flow[nod][lista[nod][i]] > 0){
tata[lista[nod][i]] = nod;
vizitat[lista[nod][i]] = true;
q.push(lista[nod][i]);
if(lista[nod][i] == n)
return 1;
}
}
return 0;
}
void solve(){
int minim, total = 0, x;
while(BFS()){
int len = lista[n].size();
for(int i = 0;i < len; ++i){
tata[n] = x;
x = n;
minim = INF;
for(x = n;x != 1;x = tata[x])
minim = min(minim,flow[tata[x]][x]);
x = n;
for(x = n;x != 1; x = tata[x]){
flow[tata[x]][x] = flow[tata[x]][x] - minim;
//flow[x][tata[x]] = flow[x][tata[x]] + minim;
}
flow[tata[n]][n] = flow[tata[n]][n] - minim;
//flow[n][tata[n]] = flow[n][tata[n]] + minim;
total += minim;
}
}
fstream g("maxflow.out",ios::out);
g << total;
}
int main(){
read();
solve();
return 0;
}