Pagini recente » Cod sursa (job #962165) | Cod sursa (job #2727449) | Cod sursa (job #2807980) | Cod sursa (job #2433190) | Cod sursa (job #2550336)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX=1010;
int n,m;
vector<int>lista[NMAX];
int c[NMAX][NMAX], f[NMAX][NMAX];
int lant[NMAX];
void citire()
{
fin>>n>>m;
int a,b,cost;
for (int i=1; i<=m; i++){
fin>>a>>b>>cost;
lista[a].push_back(b);
lista[b].push_back(a);
c[a][b]=cost;
}
}
int bfs()
{
queue<int>q;
q.push(1);
int pre[n+1];
for (int i=1; i<=n; i++)
pre[i]=0;
pre[1]=-1;
int top,nr;
bool gata=false;
while (!gata && !q.empty()){
top=q.front();
q.pop();
nr=lista[top].size();
for (int i=0; i<nr; i++){
if (pre[lista[top][i]]==0){
if (f[top][lista[top][i]]<c[top][lista[top][i]]){
pre[lista[top][i]]=top;
q.push(lista[top][i]);
if (lista[top][i]==n){
gata=true;
}
}
}
}
}
if (gata){
int ind=n;
lant[0]=0;
while (ind!=-1){
lant[0]++;
lant[lant[0]]=ind;
ind=pre[ind];
}
int minim=10000000;
for (int i=lant[0]; i>1; i--){
minim=min(minim,c[lant[i]][lant[i-1]]-f[lant[i]][lant[i-1]]);
}
return minim;
}
return 0;
}
void afisare()
{
for (int i=1; i<=n; i++){
for (int j=1; j<=n; j++){
fout<<f[i][j]<<' ';
}
fout<<'\n';
}
}
int calculareFlux()
{
int val=bfs();
int suma=0;
while (val!=0){
for (int i=lant[0]; i>1; i--){
f[lant[i]][lant[i-1]]+=val;
f[lant[i-1]][lant[i]]-=val;
}
val=bfs();
}
for (int i=0; i<lista[1].size(); i++){
suma+=f[1][lista[1][i]];
}
return suma;
}
int main()
{
citire();
fin.close();
fout<<calculareFlux()<<'\n';
return 0;
}