Cod sursa(job #241315)

Utilizator gh09chisinau gheorghita gh09 Data 9 ianuarie 2009 20:00:34
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
# include <cstdio>
# include <vector>

using namespace std;

# define FIN "maxflow.in"
# define FOUT "maxflow.out"
# define min(A, B) (A < B ? A : B)
# define max 110000
# define PB push_back
# define MAX_N 1005

int N, M;
int Q[MAX_N];
int T[MAX_N];
int viz[MAX_N];
int F[MAX_N][MAX_N];
int C[MAX_N][MAX_N];
vector <int> G[MAX_N];

    int BFS()
    {
        int ct;
        vector <int> :: iterator it;
        
        Q[ct = 0] = 1;
        memset(viz, 0, sizeof(viz));
        viz[1] = 1;
        
        for (int i = 0; i <= ct; ++i)
           for (it = G[Q[i]].begin(); it < G[Q[i]].end(); ++it)
              if (!viz[*it] && C[Q[i]][*it]>F[Q[i]][*it])
              {
                  Q[++ct] = *it;
                  T[*it] = Q[i];
                  viz[*it] = 1;
              }
        
        return viz[N];
    }

    void maxflow()
    {
        int fmax = 0, flux;
        vector <int> :: iterator it;
        
        while (BFS())
           for (it = G[N].begin(); it < G[N].end(); ++it)
           {        
               flux = max;     
                    
               if (C[*it][N] == F[*it][N] | !viz[*it]) continue;
               
               T[N] = *it;
               for (int i = N; i != 1; i = T[i])
                 flux = min(flux, C[T[i]][i] - F[T[i]][i]);
                 
               if (!flux) continue;
               
               for (int i = N; i != 1; i = T[i])
               {
                   F[T[i]][i] += flux;
                   //F[i][T[i]] -= flux;
               }
               
               fmax += flux;
           }
           
        printf("%d",fmax);
    }

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        scanf("%d%d",&N,&M);
        
        int a, b, c;
        for (int i = 1; i <= M; ++i)
        {
            scanf("%d%d%d",&a,&b,&c);
            
            C[a][b] += c;
            
            G[a].PB(b);
            G[b].PB(a);
        }
        
        maxflow();
        
        return 0;
    }