Nu aveti permisiuni pentru a descarca fisierul grader_test3.in
Cod sursa(job #275544)
Utilizator | Data | 10 martie 2009 15:38:42 | |
---|---|---|---|
Problema | Flux maxim | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.27 kb |
#include <cstdio>
#include <vector>
using namespace std;
const int oo = 1<<30;
int N, M;
int C[1001][1001];
int F[1001][1001];
vector<int> G[1001];
int T[1001];
int q[1001];
bool inq[1001];
int bq, eq;
bool viz[1001];
bool bf() {
int u;
bq = eq = 0;
q[eq++] = 1;
memset(viz, 0, sizeof(viz));
viz[1] = true;
while (bq < eq) {
u = q[bq];
for (vector<int>::const_iterator v = G[u].begin(); v != G[u].end(); ++v) {
if (viz[*v] || (C[u][*v] == F[u][*v]))
continue;
viz[*v] = true;
q[eq++] = *v;
T[*v] = u;
if (*v == N)
return true;
}
++bq;
}
return false;
}
int main(int argc, char *argv[]) {
int i, u, v, w, n;
int flow, fmin;
FILE *fi = fopen("maxflow.in", "r");
fscanf(fi, "%d %d", &N, &M);
for (i = 0; i < M; ++i) {
fscanf(fi, "%d %d %d", &u, &v, &w);
C[u][v] += w;
G[u].push_back(v);
G[v].push_back(u);
}
fclose(fi);
for (flow=0; bf(); flow += fmin) {
fmin = oo;
for (n = N; n != 1; n = T[n])
fmin = min(fmin, C[T[n]][n] - F[T[n]][n]);
//printf("Ameliorez cu %d: ", fmin);
for (n = N; n != 1; n = T[n]) {
//printf("%d <- ", n);
F[T[n]][n] += fmin;
F[n][T[n]] += fmin;
}
//printf("1\n");
}
//printf("%d\n", flow);
FILE *fo = fopen("maxflow.out", "w");
fprintf(fo, "%d\n", flow);
fclose(fo);
return 0;
}