Cod sursa(job #1154457)

Utilizator misinoonisim necula misino Data 26 martie 2014 10:29:20
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
#define N 1010
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int x,y,d,n,nod,m,i,t[N],viz[N],fl[N][N],cap[N][N];
vector<int>v[N];
queue<int>q;
inline bool bfs(){
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    q.push(1);
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        if(x==n)
        continue;
        for(vector<int>::iterator it=v[x].begin();it!=v[x].end();++it)
        if(!viz[*it]&&fl[x][*it]<cap[x][*it])
        {
            viz[*it]=1;
            t[*it]=x;
            q.push(*it);
        }
    }
    return viz[n];
}
inline int fa_flux(){
    int flux=0,mini;
    while(bfs())
    {
        for(vector<int>::iterator it=v[n].begin();it!=v[n].end();++it)
        if(fl[*it][n]<cap[*it][n])
        {
            t[n]=*it;
            nod=n;
            mini=INF;
            while(nod!=1)
            {
                mini=min(mini,cap[t[nod]][nod]-fl[t[nod]][nod]);
                nod=t[nod];
            }
            if(!mini)
            continue;
            nod=n;
            while(nod!=1)
            {
                fl[t[nod]][nod]+=mini;
                fl[nod][t[nod]]-=mini;
                nod=t[nod];
            }
            flux+=mini;
        }
    }
    return flux;
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>d;
        v[x].push_back(y);
        v[y].push_back(x);
        cap[x][y]=d;
    }
    g<<fa_flux()<<'\n';
    return 0;
}