Cod sursa(job #2187488)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 26 martie 2018 16:08:48
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
int m,n,f,ok,flux[1005][1005],capacitate[1005][1005],viz[1005],vTati[1005];
vector <int> G[1005];
bool dfs(int nod)
{
    viz[nod]=1;
    if(nod==n)
        return true;
    for(auto fiu:G[nod])
    {
        if(capacitate[nod][fiu]>flux[nod][fiu]&&!viz[fiu])
        {
            vTati[fiu]=nod;
            return dfs(fiu);
        }
    }
    return false;
}
void printmuchii()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
        {
            if(capacitate[i][j])
                printf("%d -> %d  %d %d\n",i,j,capacitate[i][j],flux[i][j]);
        }
    printf("\n");
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    int nod1,nod2,c;
    for(int i=1; i<=m; i++)
    {
        scanf("%d%d%d",&nod1,&nod2,&c);
        G[nod1].push_back(nod2);
        G[nod2].push_back(nod1);
        capacitate[nod1][nod2]=c;
    }
    while(dfs(1))
    {
        memset(viz,0,sizeof(viz));
        f=0x3f3f3f;
        for(int nod=n; nod!=1; nod=vTati[nod])
        {
            f=min(f,capacitate[vTati[nod]][nod]-flux[vTati[nod]][nod]);
        }
        for(int nod=n; nod!=1; nod=vTati[nod])
        {
            flux[nod][vTati[nod]]-=f;
            flux[vTati[nod]][nod]+=f;
        }
    }
    int rasp=0;
    for(auto fiu:G[1])
        rasp+=flux[1][fiu];
    printf("%d",rasp);
    return 0;
}