Cod sursa(job #3335050)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 21 ianuarie 2026 13:08:35
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int n,m,ok,cap[1005],tt[1005],c[1005][1005];
long long s,fmax[1005];
vector <int> v[1005];
void bfs(int x)
{
    fmax[x]=0;
    if(c[x][n])
    {
        fmax[x]=min(cap[x],c[x][n]);
    }
    for(int i=0; i<v[x].size()&&fmax[x]<cap[x]; i++)
    {
        int y=v[x][i];
        if(c[x][y]&&cap[y]==0&&y!=n)
        {
            cap[y]=min(cap[x],c[x][y]);
            tt[y]=x;
            bfs(y);
            fmax[x]+=fmax[y];
            fmax[x]=min(fmax[x],1LL*cap[x]);
        }
    }
}
void bfs2(int x, int flow)
{
    if(flow==0) return;
    if(c[x][n])
    {
        int aux;
        aux=min(c[x][n],flow);
        c[x][n]-=aux;
        c[n][x]+=aux;
        fmax[x]-=aux;
        flow-=aux;
    }
    long long sum=0;
    for(int i=0; i<v[x].size()&&fmax[x]&&flow; i++)
    {
        int y=v[x][i];
        if(tt[y]==x)
        {
            int aux=min(fmax[y],1LL*flow);
            c[x][y]-=aux;
            c[y][x]+=aux;
            fmax[x]-=aux;
            flow-=aux;
            bfs2(y,aux);
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        int x,y;
        cin>>x>>y;
        cin>>c[x][y];
        v[x].push_back(y);
        v[y].push_back(x);
    }
    do{
        ok=0;
        cap[1]=1000000005;
        bfs(1);
        for(int i=2; i<n; i++)
        {
            if(cap[i]>0&&c[i][n]) ok=1;
        }
        s+=fmax[1];
        bfs2(1,fmax[1]);
        for(int i=1; i<=n; i++)
        {
            cap[i]=0;
            tt[i]=0;
            fmax[i]=0;
        }
    }while(ok);
    cout<<s<<'\n';
	return 0;
}