Cod sursa(job #2546671)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 14 februarie 2020 13:01:41
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include<bits/stdc++.h>
using namespace std;
const int maxN=1005;

int c[maxN][maxN],f[maxN][maxN];
vector<int> v[maxN];
bool seen[maxN];

deque<int> q;
int source,destination;

inline void addEdge(int x,int y,int z)
{
    c[x][y]=z;
    v[x].push_back(y);
    v[y].push_back(x);
}
int tt[maxN];

inline bool bfs()
{
    memset(seen,0,sizeof(seen));

    q.push_back(source);

    seen[source]=1;

    while(!q.empty())
    {
        int nod=q.front();

        q.pop_front();

        for(auto it:v[nod])
        {
            if(!seen[it] && f[nod][it]<c[nod][it])
            {
                tt[it]=nod;
                seen[it]=1;
                q.push_back(it);
            }
        }
    }

    return seen[destination];
}

int n,m,x,y,z,sol;


int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);


    scanf("%d%d",&n,&m);

    source=1;destination=n;

    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        addEdge(x,y,z);
    }

    while(bfs())
    {

        for(auto it:v[destination])
        {
            int x=it;
            int flow=c[x][destination]-f[x][destination];

            for(int i=x;i!=source;i=tt[i])
                flow=min(flow,c[tt[i]][i]-f[tt[i]][i]);

            f[x][destination]+=flow;
            f[destination][x]-=flow;

            for(int i=x;i!=source;i=tt[i])
            {
                f[tt[i]][i]+=flow;
                f[i][tt[i]]-=flow;
            }

            sol+=flow;
        }
    }

    printf("%d\n",sol);

    return 0;
}