Cod sursa(job #2528573)

Utilizator patrickdanDan patrick patrickdan Data 22 ianuarie 2020 10:13:50
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <cstdio>
#include<queue>

using namespace std;
int n,m;
int c[1001][1001];
int f[1001][1001];
int viz[1001];
int ant[1001];
vector<int>G[1001];
queue<int > q;
int BFS()
{
    q.push(1);
    for(int i=0;i<=n;i++)
        viz[i]=0;
    viz[1]=1;
    while(!q.empty())
    {
        if( q.front()!=n){
        for(int i=0;i<G[q.front()].size();i++)
        {
        if(!(c[q.front()][G[q.front()][i]]==f[q.front()][G[q.front()][i]] || viz[G[q.front()][i]]==1))
            {
                viz[G[q.front()][i]]=1;
                q.push(G[q.front()][i]);
                ant[G[q.front()][i]]=q.front();
            }
        }
        }
        q.pop();
    }
    return viz[n];
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int a,b,cc;
        scanf("%d%d%d",&a,&b,&cc);
        G[a].push_back(b);
        G[b].push_back(a);
        c[a][b]=cc;
    }
    int flux=0;
    while(BFS())
    {
    for(int i=0;i<G[n].size();i++)
    {
    int nn=G[n][i];
    if(c[nn][n]!=f[nn][n] || viz[nn]==1)
    {
        ant[n]=nn;
        int minf=1000000001;
        for(int nnn=n ; nnn!=1;nnn=ant[nnn])
            if(minf> c[ant[nnn]][nnn]-f[ant[nnn]][nnn])
                minf=c[ant[nnn]][nnn]-f[ant[nnn]][nnn];
        for(int nnn=n ; nnn!=1 ;nnn=ant[nnn])
            f[ant[nnn]][nnn]+=minf,f[nnn][ant[nnn]]-=minf;
    flux+=minf;
    }
    }
    }
    printf("%d",flux);
    return 0;
}