Cod sursa(job #303377)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 9 aprilie 2009 20:01:28
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.11 kb
# include <cstdio>
# include <algorithm>

using namespace std;

# define FIN "maxflow.in"
# define FOUT "maxflow.out"
# define INF 1000000000
# define min(a, b) (a < b ? a : b)
# define MAXN 1005

struct Nod
{
       int Fiu;
       Nod *next;
} *Graf[MAXN], *p;

int N, M;
int Cap[MAXN][MAXN];
int T[MAXN], Q[MAXN];

    int BFS()
    {
        Nod *j;
        int vf, i;
        
        memset(T, 0, sizeof(T));
        Q[vf = 1] = 1; T[1] = -1;
        
        for (i = 1; i <= vf; ++i)
        {
            for (j = Graf[Q[i]]; j != NULL; j = j -> next)
              if (!T[j -> Fiu] && Cap[Q[i]][j -> Fiu])
              {
                 T[j -> Fiu] = Q[i];
                 if (j -> Fiu == N) continue;
                 Q[++vf] = j -> Fiu;
              }
        }
        
        return T[N];
    }

    int maxflow()
    {
        Nod *j;
        int i, Flux = 0, Flow;
        
        while (BFS())
          for (j = Graf[N]; j != NULL; j = j -> next)
            if (T[j -> Fiu] && Cap[j -> Fiu][N])
            {
                Flow = INF;
                T[N] = j -> Fiu;
                for (i = N; T[i] != -1; i = T[i])
                   Flow = min(Flow, Cap[T[i]][i]);
                
                if (!Flow) continue;
                
                Flux += Flow;
                
                for (i = N; T[i] != -1; i = T[i])
                {
                    Cap[T[i]][i] -= Flow;
                    Cap[i][T[i]] += Flow;
                }
            }
        
        return Flux;
    }

    int main()
    {
        freopen(FIN, "r", stdin);
        freopen(FOUT, "w", stdout);
        
        scanf("%d %d", &N, &M);
        
        int a, b, c, i;
        for (i = 1; i <= M; ++i)
        {
            scanf("%d %d %d", &a, &b, &c);
            
            Cap[a][b] += c;
            
            p = new Nod; p -> Fiu = b; p -> next = Graf[a]; Graf[a] = p;
            p = new Nod; p -> Fiu = a; p -> next = Graf[b]; Graf[b] = p;
        }
        
        printf("%d", maxflow());
        
        return 0;
    }