Cod sursa(job #1464438)

Utilizator Liviu98Dinca Liviu Liviu98 Data 23 iulie 2015 15:45:35
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <stdio.h>
#include <deque>
#include <vector>
#define NMax 1001
using namespace std;
int N,M,Cap[NMax][NMax],flux[NMax][NMax],t[NMax],sol;
bool uz[NMax];
deque<int> Q;
vector<int> Graf[NMax];

int BFS()
{
    for(int i=1;i<=N;i++)
        t[i]=uz[i]=0;
    Q.push_back(1);
    while(!Q.empty())
    {
        int nod=Q.front();
        Q.pop_front();
        for(vector<int>::iterator it=Graf[nod].begin();it!=Graf[nod].end();it++)
        {
            int vecin=*it;
            if(Cap[nod][vecin]>flux[nod][vecin] && uz[vecin]==false)
            {
                uz[vecin]=true;
                Q.push_back(vecin);
                t[vecin]=nod;
            }
        }
    }
    return uz[N];
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        Graf[x].push_back(y);
        Graf[y].push_back(x);
        Cap[x][y]=z;
    }

    while(BFS())
    {
        for(int i=1;i<=N;i++)
        {
            if(Cap[i][N]>flux[i][N] && t[i])
            {
                int fmin=Cap[i][N]-flux[i][N];

                for(int j=i;j!=1;j=t[j])
                    fmin=min(fmin,(Cap[t[j]][j]-flux[t[j]][j]));

                for(int j=i;j!=1;j=t[j])
                {
                    flux[t[j]][j]=flux[t[j]][j]+fmin;
                    flux[j][t[j]]=flux[j][t[j]]-fmin;
                }
                flux[i][N]+=fmin;
                flux[N][i]-=fmin;
                sol=sol+fmin;
            }
        }
    }
    printf("%d",sol);
}