Cod sursa(job #240567)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 7 ianuarie 2009 22:29:18
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<stdio.h>
struct Nod {
    int x;
    Nod *next;
};
int C[1002][1002];
int Q[1002];
int maxflow;
int viz[1002];
int cost;
int x;
int p[1002];
int y;
int n;
int ok;
Nod *a[1002];
int m;

int BF()
{
    Q[1] = 1;
    int l = 1;
    int r = 1;
    for(int i = 1; i <= n; i++)
     {
      viz[i] = 0;
      p[i] = 0;
     }
    viz[1] = 1;
    while (l <= r)
     {
         for(Nod *it = a[Q[l]]; it; it = it -> next)
          if (!viz[it -> x])
           if (C[Q[l]][it->x] > 0)
           {
            Q[++r] = it -> x;
            p[it -> x] = Q[l];
            if (it -> x == n) break;
           }
         if (Q[r] == n) break;
         l++;
     }
     int min = 100011;
     int i = n;
     while (p[i])
       {
           if (min > C[p[i]][i]) min = C[p[i]][i];
           i = p[i];
       }
     i = n;
     while (p[i])
       {
           C[p[i]][i] -= min;
           C[i][p[i]] += min;
           i = p[i];
       }
     if (min == 100011) return 0;
     return min;
}
void insert(Nod *&u, int v)
{
    Nod *f = new Nod;
    f -> x = v;
    f -> next = u;
    u = f;
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= m; i++)
     {
         scanf("%d %d %d", &x, &y, &cost);
         C[x][y] = cost;
         insert(a[x],y);
         insert(a[y],x);
     }
    while (!ok)
     {
         int now = BF();
         if (now == 0) ok = 1;
         maxflow += now;
     }
    printf("%d",maxflow);
    return 0;
}