Cod sursa(job #2022744)

Utilizator dacianouaPapadia Mortala dacianoua Data 17 septembrie 2017 09:44:32
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdlib.h>
#include <stdio.h>
#include <queue>
#include <limits.h>
#define nmax 1000
#define mmax 5000
using namespace std;
FILE *fin,*fout;
int m,n,a[nmax+5][nmax+5],drum[nmax+5];
int bfs()
{
    int viz[nmax+5]={0},tata[nmax+5]={0},k;
    tata[1]=-1;
    queue<int> path;
    path.push(1);
    viz[1]=1;
    while(!path.empty())
    {
        k=path.front();
        path.pop();
        for(int i=1;i<=n;i++)
            if(!viz[i] && a[k][i]!=0)
            {
                viz[i]=1;
                tata[i]=k;
                path.push(i);
            }
    }
    int i=n,j=1;
    while(tata[i]!=-1 && tata[i]!=0)
    {
        drum[j]=i;
        j++;
        i=tata[i];
    }
    drum[j]=1;
    return viz[n]==1;
}
int main()
{
    fin=fopen("maxflow.in","r");
    fout=fopen("maxflow.out","w");
    int x,y,z,minval,fluxmax=0;
    fscanf(fin,"%d %d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        fscanf(fin,"%d %d %d",&x,&y,&z);
        a[x][y]=z;
    }
    while(bfs())
    {
        x=1;minval=INT_MAX;
        while(drum[x]!=1)
        {
            if(minval>a[drum[x+1]][drum[x]])
                minval=a[drum[x+1]][drum[x]];
                x++;
        }
        fluxmax+=minval;
        x=1;
        while(drum[x]!=1)
        {
            a[drum[x+1]][drum[x]]-=minval;
            x++;
        }
    }
    fprintf(fout,"%d",fluxmax);
    return 0;
}