Cod sursa(job #1969490)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 18 aprilie 2017 14:54:05
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int inf=0x3f3f3f3f;
int C[1001][1001],n,tata[1001];
vector<int>G[1001];
queue<int>Q;
bitset<1001>viz;
bool bfs()
{
    Q.push(1);
    viz[1]=1;
    while(Q.size())
    {
        int nod=Q.front();
        Q.pop();
        if(nod==n) continue;
        for(unsigned i=0;i<G[nod].size();i++)
        {
            if(viz[G[nod][i]]==0 && C[nod][G[nod][i]]!=0)
            {
                tata[G[nod][i]]=nod;
                viz[G[nod][i]]=1;
                Q.push(G[nod][i]);
            }
        }
    }
    if(viz[n]==1) return 1;
    return 0;
}
int main()
{
    int m,x,y,i,fmin,flux=0;
    fin>>n>>m;
    while(m--)
    {
        fin>>x>>y;
        fin>>C[x][y];
        G[x].push_back(y);
        G[y].push_back(x);
    }
    while(bfs())
    {
        for(unsigned j=0;j<G[n].size();j++)
        {
            if(viz[G[n][j]]==0 || C[G[n][j]][n]==0) continue;
            tata[n]=G[n][j];
            fmin=inf;
            for(i=n;i!=1;i=tata[i])
            {
                fmin=min(fmin,C[tata[i]][i]);
            }
            if(fmin==0) continue;
            for(i=n;i!=1;i=tata[i])
            {
                C[tata[i]][i]-=fmin;
                C[i][tata[i]]+=fmin;
            }
            flux+=fmin;
        }
        viz.reset();
    }
    fout<<flux;
}