Cod sursa(job #1333517)

Utilizator Eugen_VlasieFMI Vlasie Eugen Eugen_Vlasie Data 3 februarie 2015 11:46:00
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<fstream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int fmax,ma,q[1005],pr,ul,n,m,i,a,b,viz[1005],pred[1005],cap[1005][1005];
vector<int> v[1005];
int bfs()
{
    int y,x;
    memset(viz,0,sizeof(viz));
    pr=1;
    ul=1;
    q[1]=1;
    viz[1]=1;
    while(pr<=ul)
    {
        x=q[pr++];
        for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
        {
            y=*it;
            if(cap[x][y]&&!viz[y])
            {
                q[++ul]=y;
                pred[y]=x;
                viz[y]++;
            }
        }
    }
    return viz[n];
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>a>>b;
        f>>cap[a][b];
        v[a].push_back(b);
        v[b].push_back(a);
    }
    while(bfs())
    {
        for(vector<int>::iterator it=v[n].begin();it!=v[n].end();it++)
        {
            a=*it;
            b=a;
            ma=cap[a][n];
            if(cap[a][n])
            {
                while(b>1)
                {
                    if(ma>cap[pred[b]][b])
                        ma=cap[pred[b]][b];
                    b=pred[b];
                }
                b=a;
                cap[a][n]-=ma;
                cap[n][a]+=ma;
                while(b>1)
                {
                    cap[pred[b]][b]-=ma;
                    cap[b][pred[b]]+=ma;
                    b=pred[b];
                }
                fmax+=ma;
            }
        }
    }
    g<<fmax<<'\n';
    return 0;
}