Cod sursa(job #1133388)

Utilizator addy01adrian dumitrache addy01 Data 4 martie 2014 20:36:16
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define maxn 1010
#define maxm 5010
#define INF 1<<30
using namespace std;

ifstream in("maxflow.in");
ofstream out("maxflow.out");

vector <int> Graf[maxn];
bool viz[maxn];
int n;
int capacitate[maxn][maxn];
int flux_bagat[maxn][maxn];
int tata[maxn];


inline int minim(int a,int b)
{
    return a<b ? a:b;
}

int BFS()
{
    memset(viz,0,sizeof(viz));
    queue <int> Q;
    Q.push(1);
    viz[1]=1;
    vector <int> :: iterator it;
    int nod;
    while(!Q.empty())
    {
        nod=Q.front();
        Q.pop();
        if(nod==n)
            continue;
        for(it=Graf[nod].begin();it!=Graf[nod].end();it++)
        {
            if(capacitate[nod][*it]==flux_bagat[nod][*it] || viz[*it])
                continue;
            viz[*it]=1;
            tata[*it]=nod;
            Q.push(*it);
        }
    }
    return viz[n];
}

int main()
{
    int x,y,z,m;
    int fmin,flow;
    in>>n>>m;
    while(m--)
    {
        in>>x>>y>>z;
        Graf[x].push_back(y);
        Graf[y].push_back(x);
        capacitate[x][y]=z;
    }
    vector <int> :: iterator it;
    for(flow=0;BFS();)
        for( it=Graf[n].begin();it!=Graf[n].end();it++)
        {
            if(capacitate[*it][n]==flux_bagat[*it][n] || !viz[*it])
                continue;
            tata[n]=*it;

            fmin=INF;
            for(int nod=n;nod!=1;nod=tata[nod])
                fmin=minim(fmin,capacitate[tata[nod]][nod]-flux_bagat[tata[nod]][nod]);

            if(fmin==0)
                continue;

            for(int nod=n;nod!=1;nod=tata[nod])
            {
                flux_bagat[tata[nod]][nod]+=fmin;
                flux_bagat[nod][tata[nod]]-=fmin;
            }
            flow+=fmin;
        }

    out<<flow;
    return 0;
}