Pagini recente » Cod sursa (job #2054780) | Cod sursa (job #328549) | Cod sursa (job #755045) | Cod sursa (job #2562579) | Cod sursa (job #2265071)
#include<iostream>
#include<fstream>
#include<string.h>
#include<vector>
#include<queue>
using namespace std;
#define NMAX 1005
#define INF 0X3f3f3f3f
vector <int> G[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX], TT[NMAX];
bool viz[NMAX];
int n;
int bf(){
int nodT, nodF; //F=fiu, T=tata
vector<int> :: iterator it;
memset(viz, 0, sizeof(viz));
queue <int> q;
q.push(1);
while(!q.empty()){
nodT = q.front();
q.pop();
if(nodT==n) continue;
for(it = G[nodT].begin(); it != G[nodT].end(); it++){
nodF = *it;
if(viz[nodF] || C[nodT][nodF] == F[nodT][nodF] ) continue;
TT[nodF]=nodT;
viz[nodF]=true;
q.push(nodF);
}
}
return viz[n];
}
int main(){
FILE *in=fopen("maxflow.in","r");
FILE *out=fopen("maxflow.out","w");
int m,i,x,y,z;
int flow = 0, nod, fmin;
fscanf(in,"%i %i",&n,&m);
for(i=1;i<=m;i++){
fscanf(in,"%d %d %d",&x,&y,&z);
C[x][y] += z;
G[x].push_back(y);
G[y].push_back(x);
}
while(bf()){
for( i=0;i<G[n].size();i++ ){
/*
nod = G[n][i];
if( !viz[nod] || C[nod][n]==F[nod][n] ) continue;
TT[n]=nod;
*/
fmin = INF;
for(nod=n; nod!=1; nod=TT[nod])
fmin = min( fmin, C[ TT[nod] ][nod] - F[ TT[nod] ][nod] );
if(fmin==0) continue;
flow+=fmin;
for(nod=n; nod!=1; nod = TT[nod] ){
F[ TT[nod] ][nod] += fmin;
F[ nod ][ TT[nod] ] -= fmin;
}
}
}
fprintf(out,"%i",flow);
fclose(in); fclose(out);
return 0;
}