Pagini recente » Cod sursa (job #2583341) | Cod sursa (job #1020253) | Cod sursa (job #1026747) | Cod sursa (job #3143405) | Cod sursa (job #309844)
Cod sursa(job #309844)
#include <stdio.h>
#include <list>
#define DIM 1002
#define INF 5000*110001
using namespace std;
list<int> L[DIM];
int C[DIM][DIM];
int F[DIM][DIM];
int T[DIM];
int V[DIM];
int Q[DIM*DIM];
int n,m,x,y,c,i,flux,fr,t,minim;
int BF() {
int p,u,nod,vec,ok;
list<int>::iterator it;
memset(V,0,sizeof(V));
p = 1;u = 1;
Q[p] = 1; V[1]=1;
ok = 0;
while (p<=u) {
nod = Q[p];
for (it = L[nod].begin(); it!=L[nod].end(); it++) {
vec = *it;
if (V[vec]==0 && C[nod][vec]>F[nod][vec]) {
if (vec == n) {
ok = 1;
continue;
}
u++;
Q[u] = vec;
V[vec] = 1;
T[vec] = nod;
}
}
p++;
}
return ok;
}
int main(){
FILE *f = fopen("maxflow.in","r");
fscanf(f,"%d%d",&n,&m);
for (i=1;i<=m;i++) {
fscanf(f,"%d%d%d",&x,&y,&c);
C[x][y] = c;
L[x].push_back(y);
L[y].push_back(x);
}
fclose(f);
list<int>::iterator it;
flux = 0;
while (BF()) {
for (it = L[n].begin(); it!=L[n].end(); it++) {
fr = *it;
if (!V[fr] || C[fr][n] == F[fr][n]){
continue;
}
T[n] = fr;
for (minim = INF, t = n; T[t]; t = T[t]) {
if (minim>C[T[t]][t] - F[T[t]][t])
minim = C[T[t]][t] - F[T[t]][t];
}
for (t = n; T[t]; t = T[t]) {
F[T[t]][t]+=minim;
F[t][T[t]]-=minim;
}
if (minim!=INF) {
flux+=minim;
}
}
}
FILE *g = fopen("maxflow.out","w");
fprintf(g,"%d",flux);
fclose(g);
return 0;
}