Cod sursa(job #1467787)

Utilizator vladttturcuman vlad vladtt Data 4 august 2015 20:38:08
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <cstring>
#define Max 1000000000
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

struct coada{
    int nod,cost,come;
}co[5500];


int qw[1010][1010];
int maxx[1010][1010];

int viz[1010];

int in,s,sf,nod,cost,i,n,m,j,x,y,c;


void _think(int last)
{

    int cost= co[last].cost;

    while(co[last].come!=0)
    {
        int prev=co[last].come;

        qw[co[prev].nod][co[last].nod]+=cost;
        qw[co[last].nod][co[prev].nod]-=cost;

        last=prev;
    }
}

bool bfs()
{
    in=1;
    sf=0;
    co[++sf].nod=1;
    co[sf].come=0;
    co[sf].cost=Max;

    memset(viz,0,sizeof(viz));

    while(in<=sf)
    {
        nod=co[in].nod;
        cost=co[in].cost;

        for(i=1;i<=n;i++)
        {
            if(qw[nod][i]<maxx[nod][i] && viz[i]==0)
            {
                viz[i]==i;
                co[++sf].nod=i;
                co[sf].come=in;
                co[sf].cost=  cost < (maxx[nod][i]-qw[nod][i]) ? cost : (maxx[nod][i]-qw[nod][i]);


                if(i==n)
                {
                    s+=co[sf].cost;
                    _think(sf);


                    return true;
                }

            }
        }
        in++;
    }

    return false;

}

int main()
{

    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        maxx[x][y]=c;
    }

    while(bfs());

    fout<<s;

    return 0;
}