Pagini recente » Cod sursa (job #1008735) | Cod sursa (job #941850) | Cod sursa (job #2419622) | Cod sursa (job #2669536) | Cod sursa (job #1453704)
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int MAXN=1000,INF=110001;
FILE* f = fopen("maxflow.in","r");
FILE* h = fopen("maxflow.out","w");
int N, M;
vector<int> graf[1 + MAXN];
int capacitate[1 + MAXN][1 + MAXN];
int flux[1 + MAXN][1 + MAXN];
int q[1+MAXN],st,dr;
int fost[1+MAXN];
int fluxtotal;
bool bfs(){
st=0;
dr=0;
memset(fost,0,sizeof(fost));
q[0]=1;
fost[1]=true;
while ( st<=dr ){
int nod=q[st];
++st;
for ( int i=0;i<(int)graf[nod].size();++i ){
int vecin=graf[nod][i];
if (!fost[vecin]&&capacitate[nod][vecin]-flux[nod][vecin] > 0){
q[++dr]=vecin;
fost[vecin]=nod;
}
}
}
return fost[N] > 0;
}
int main(void) {
int i;
fscanf(f,"%d%d", &N, &M);
for (i = 0; i < M; ++i) {
int x, y, fl;
fscanf(f,"%d%d%d", &x, &y, &fl);
graf[x].push_back(y);
capacitate[x][y] = fl;
}
while ( bfs() ){
int nod=N;
int mincapacitate = INF;
while (nod != fost[nod]){
if (capacitate[fost[nod]][nod]-flux[fost[nod]][nod] < mincapacitate)
mincapacitate = capacitate[fost[nod]][nod]-flux[fost[nod]][nod];
nod = fost[nod];
}
nod=N;
while (nod != fost[nod]){
flux[fost[nod]][nod] += mincapacitate;
flux[nod][fost[nod]] -= mincapacitate;
nod=fost[nod];
}
}
for ( int i=1;i<=N;++i )
fluxtotal+=flux[1][i];
fprintf(h,"%d\n", fluxtotal);
return 0;
}