Cod sursa(job #1593345)

Utilizator radu_uniculeu sunt radu radu_unicul Data 8 februarie 2016 16:03:41
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include<cstdio>
#include<vector>
#include<queue>

using namespace std;

#define DMAX 1000
vector<int> v[DMAX];
int C[DMAX][DMAX], F[DMAX][DMAX];
bool viz[DMAX];
queue<int> q;
int n, m, x, y, z, flow;
int T[DMAX];

void read()
{
    freopen("maxflow.in", "r", stdin);
    scanf("%d %d", &n, &m);
    for(int i=0; i<m; i++)
    {
        scanf("%d %d %d", &x, &y, &z);
        v[x].push_back(y);
        v[y].push_back(x);
        C[x][y]=z;
    }
}

bool bfs()
{
    for(int i=0; i<DMAX; i++) viz[i]=0;
    q.push(1);
    viz[1]=1;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(vector <int>::iterator it = v[nod].begin(); it!=v[nod].end(); it++)
        {
            if(F[nod][*it]<C[nod][*it]&&!viz[*it])
            {
                q.push(*it);
                T[*it]=nod;
                viz[*it]=1;
            }
        }
    }
    return viz[n];
}

int main()
{
    read();
    while(bfs())
    {
        for(vector<int>::iterator it=v[n].begin(); it!=v[n].end(); ++it)
        {
            if(viz[*it]&&F[*it][n]<C[*it][n])
            {
                int minflow=C[*it][n]-F[*it][n];
                int node=*it;
                while(T[node]!=0)
                {
                    if(minflow>C[T[node]][node]-F[T[node]][node]) minflow=C[T[node]][node]-F[T[node]][node];
                    node=T[node];
                }
                flow+=minflow;
                node=*it;
                F[node][n]+=minflow;
                F[n][node]-=minflow;

                while(T[node]!=0)
                {
                    F[T[node]][node]+=minflow;
                    F[node][T[node]]-=minflow;
                    node=T[node];
                }
            }
        }
    }
    freopen("maxflow.out","w",stdout);
    printf("%d",flow);
}