Cod sursa(job #2016377)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 29 august 2017 11:41:17
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
FILE *f=fopen("maxflow.in","r");
FILE *g=fopen("maxflow.out","w");
vector<int> G[1005];
int C[1005][1005];
int F[1005][1005];
bool viz[1005];
int c[1005];
int T[1005];
int st,dr;
int N,M;
bool BFS(int S,int D)
{
    memset(viz,0,sizeof(viz));
    st=dr=1;
    c[1]=S;
    viz[S]=1;
    while(st<=dr)
    {
        int nod=c[st];
        st++;
        if(nod==D)continue;
        for(auto it:G[nod])
        {
            if(!viz[it]&&F[nod][it]!=C[nod][it])
            {
                viz[it]=1;
                T[it]=nod;
                c[++dr]=it;
            }
        }
    }
    return viz[D];
}
int maxflow(int S,int D)
{
    int flux=0;
    while(BFS(S,D))
    {
        for(auto it:G[D])
        {
            if(F[it][D]==C[it][D]||!viz[it])continue;
            int fmin=1<<30;
            T[D]=it;
            for(int nod=D;nod!=S;nod=T[nod])fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
            if(fmin==0)continue;
            for(int nod=D;nod!=S;nod=T[nod])
            {
                F[T[nod]][nod]+=fmin;
                F[nod][T[nod]]-=fmin;
            }
            flux+=fmin;
        }
    }
    return flux;
}
int main()
{
    fscanf(f,"%d %d",&N,&M);
    for(int i=1;i<=M;i++)
    {
        int x,y,c;
        fscanf(f,"%d %d %d",&x,&y,&c);
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y]+=c;
    }
    fprintf(g,"%d",maxflow(1,N));
    return 0;
}