Cod sursa(job #1969788)

Utilizator george_stelianChichirim George george_stelian Data 18 aprilie 2017 17:30:15
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

const int inf=1e9;
vector<int> g[1010];
queue<int> q;
int tata[1010],cap_flow[1010][1010],sursa,dest,n;
char vaz[1010];

int bfs()
{
    for(int i=1;i<=n;i++) vaz[i]=0;
    q.push(sursa);
    vaz[sursa]=1;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(vector<int>::iterator it=g[nod].begin();it!=g[nod].end();it++)
            if(!vaz[*it] && cap_flow[nod][*it])
            {
                tata[*it]=nod;
                vaz[*it]=nod;
                if(*it!=dest) q.push(*it);
            }
    }
    return vaz[dest];
}

int main()
{
    freopen("maxflow.in", "r" ,stdin);
    freopen("maxflow.out", "w", stdout);
    int m,x,y,c,flux=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        g[x].push_back(y);
        g[y].push_back(x);
        cap_flow[x][y]+=c;
    }
    sursa=1;dest=n;
    while(bfs())
    {
        for(vector<int>::iterator it=g[dest].begin();it!=g[dest].end();it++)
            if(vaz[*it] && cap_flow[*it][dest])
            {
                tata[dest]=*it;
                int s=inf;
                for(int nod=dest;nod!=sursa;nod=tata[nod]) s=min(s,cap_flow[tata[nod]][nod]);
                for(int nod=dest;nod!=sursa;nod=tata[nod])
                {
                    cap_flow[tata[nod]][nod]-=s;
                    cap_flow[nod][tata[nod]]+=s;
                }
                flux+=s;
            }
    }
    printf("%d",flux);
    return 0;
}