Pagini recente » Cod sursa (job #3193052) | Cod sursa (job #3177834) | Cod sursa (job #999340) | Cod sursa (job #751889) | Cod sursa (job #1384156)
#include <iostream>
#include <climits>
#include <stdio.h>
using namespace std;
const int N=1003, M=5005;
short vf[M],urm[M],lst[N],cost[M];
int n,m,nr;
int padre[N],coada[M+M],dus[N][N],intors[N][N]; //vector de tati, coada, cost: dus, intors
bool ver[N];
void afisare(int x){
FILE *out;
out=fopen("maxflow.out","w");
fprintf(out,"%d",x);
fclose(out);
}
inline int minim(int x, int y) {
if(x>y) return y;
else return x;
}
inline void adauga(int x, int y, int c){
nr++;
vf[nr]=y;
urm[nr]=lst[x];
lst[x]=nr;
cost[nr]=c;
}
void citire(){
FILE *in;
in=fopen("maxflow.in","r");
fscanf(in,"%d%d",&n,&m);
int a,b,c;
for(int i=1;i<=m;i++){
fscanf(in,"%d%d%d",&a,&b,&c);
dus[a][b]+=c;
adauga(a,b,c);
adauga(b,a,c);
}
fclose(in);
}
bool bfs(){
int p,x,y,st,dr;
dr=0; st=1;
coada[++dr]=1;
for(int i=1;i<=n;i++) ver[i]=0;
ver[1]=1;
while(st<=dr){
x=coada[st];
p=lst[x];
while(p!=0){
y=vf[p];
p=urm[p];
if(ver[y]==1 ||dus[x][y]==intors[x][y]) continue;//adaug in coada doar dc nu am mai ajuns in nod sau dc respecta legea lui ohm
ver[y]=1;
padre[y]=x;
coada[++dr]=y;
if(y==n) return 1;
}
st++;
}
return 0;
}
void rez(){
int rez=0,rmin;
while(bfs()){
rmin=INT_MAX;
for(int i=n;i!=1;i=padre[i]) {rmin=minim(rmin, dus[padre[i]][i]-intors[padre[i]][i] ); }//gasesc muchia de lungime minima in graf
for(int i=n;i!=1;i=padre[i]){
intors[padre[i]][i]+=rmin; //si o adaug
intors[i][padre[i]]-=rmin;// si dupa o scad (logic)
}
rez+=rmin;
}
afisare(rez);
}
int main()
{
citire();
rez();
return 0;
}