Pagini recente » Cod sursa (job #1368536) | brasov_11_jr | Cod sursa (job #762824) | Cod sursa (job #421240) | Cod sursa (job #749481)
Cod sursa(job #749481)
#include <fstream>
#include <queue>
#include <cstring>
#define costq first
#define dinq second.second
#define nodq second.first
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int N=1010;
const int INF=1<<30;
int n,m;
int flux[N][N],din[N],cale[N];
bool viz[N];
typedef pair<int, pair<int,int> > triplet;
void read(){
int i,x,y,z;
in>>n>>m;
for(i=1;i<=m;++i){
in>>x>>y>>z;
flux[x][y]=z;
}
}
triplet mt(int x,int y,int z){
triplet aux;
aux.costq=x;
aux.dinq=z;
aux.nodq=y;
return aux;
}
inline int min(const int & x,const int & y){
return x<y ? x:y;
}
int Ameliorare(){
int i,rez=0,aux;
priority_queue < triplet > coada;
triplet curent;
memset(viz,0,sizeof(viz));
memset(cale,0,sizeof(cale));
memset(din,0,sizeof(din));
coada.push(mt(INF,1,0));
while(coada.empty()==false){
curent=coada.top();
coada.pop();
if(viz[curent.nodq]==1)
continue;
if(curent.nodq==n){
cale[curent.nodq]=curent.costq;
din[curent.nodq]=curent.dinq;
rez=cale[n];
break;
}
cale[curent.nodq]=curent.costq;
din[curent.nodq]=curent.dinq;
aux=curent.nodq;
viz[aux]=1;
for(i=1;i<=n;++i){
if(viz[i]==0 && flux[aux][i]!=0 && cale[i]<min(flux[aux][i],cale[aux])){
cale[i]=min(flux[aux][i],cale[aux]);
coada.push(mt(min(flux[aux][i],cale[aux]),i,aux));
}
}
}
aux=n;
int d=din[aux];
while(d){
flux[d][aux]-=rez;
flux[aux][d]+=rez;
aux=d;
d=din[aux];
}
return rez;
}
int FordFulkerson(){
int f=0,mareste;
while(true){
mareste=Ameliorare();
if(mareste<=0)
return f;
f+=mareste;
}
}
int main(){
read();
out<<FordFulkerson();
return 0;
}