Cod sursa(job #1829312)

Utilizator delta_wolfAndrei Stoica delta_wolf Data 14 decembrie 2016 19:24:04
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <cstdio>
#include<vector>
#include<algorithm>
#define inf 1000000000

using namespace std;

vector<int> v[1000];
vector<int> invn;
int n,m,lst,rst,i,j,a,b,c,r;
int viz[1000],st[1000];
int mat[1000][1000],rez[1000][1000];
int main()
{

    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        a--;
        b--;
        v[a].push_back(b);
        v[b].push_back(a);
        mat[a][b] = c;
    }
    while(1)
    {
        for(i=0;i<n;i++)
            viz[i]=-2;
        viz[0]=-1;
        st[0]=0;
        lst=1;
        rst=0;
        while(lst!=rst)
        {
            r=st[rst];
            rst++;
            if(r==n-1)
                continue;
            for(i=0;i<v[r].size();i++)
            {
                if(viz[v[r][i]]==-2&&mat[r][v[r][i]]!=rez[r][v[r][i]])
                {
                    viz[v[r][i]]=r;
                    st[lst++]=v[r][i];
                }
            }
        }
        if(viz[n-1]==-2)
            break;
        for(i=0;i<v[n-1].size();i++)
        {
            if(viz[v[n-1][i]]!=-2&&mat[v[n-1][i]][n-1]!=rez[v[n-1][i]][n-1])
            {
                viz[n-1]=v[n-1][i];
                a=n-1;
                b=inf;
                while(viz[a]!=-1)
                {
                    b=min(b,mat[viz[a]][a]-rez[viz[a]][a]);
                    a=viz[a];
                }
                a=n-1;
                while(viz[a]!=-1)
                {
                    rez[a][viz[a]]-=b;
                    rez[viz[a]][a]+=b;
                    a=viz[a];
                }
            }
        }
    }
    c=0;
    for(i=0;i<v[0].size();i++)
        c +=rez[0][v[0][i]];
    printf("%d", c);
    return 0;
}