Cod sursa(job #1496649)

Utilizator ade_tomiEnache Adelina ade_tomi Data 5 octombrie 2015 12:21:52
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int cap[1004][1004],q[1004],pred[1004];
vector<int> v[1004];
void bfs(int s , int t)
{

    int start=0,stop=0;
    stop++;
    q[stop]=s;
    pred[s]=-2;
    while(start<stop&&pred[t]==-1)
    {
        start++;
        for(int i=0;i<v[q[start]].size();i++)
        {

            int nod=v[q[start]][i];
            if(pred[nod]==-1&&cap[q[start]][nod]!=0)
            {
                pred[nod]=q[start];
                stop++;
                q[stop]=nod;

            }
        }

    }

}
int  flux(int n, int s ,int t)
{
    int sol=0;
    while(1)
    {


        memset(pred, -1, sizeof(pred));
        bfs(s,t);
        if(pred[t]==-1)
            break;
        int capmin;
        for(int nod=1;nod<=n;nod++)
        {

            if(pred[nod]!=-1&&cap[nod][t]!=0)
            {

                capmin=cap[nod][t];
                for(int vv=nod,u=pred[vv];u>0;vv=u,u=pred[vv])
                    capmin=min(capmin, cap[u][vv]);
                if(!capmin)
                    continue;
                cap[nod][t]-=capmin;
                cap[t][nod]+=capmin;
                for(int vv=nod,u=pred[vv];u>0;vv=u,u=pred[vv])
                {

                    cap[u][vv]-=capmin;
                    cap[vv][u]+=capmin;
                }
                sol+=capmin;
            }
        }
    }
    return sol;

}
int main()
{

    int n,m,i,x,y,c;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {

        scanf("%d%d%d",&x,&y,&c);
        cap[x][y]+=c;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    printf("%d",flux(n,1,n));
    return 0;
}