Cod sursa(job #2034744)

Utilizator tifui.alexandruTifui Ioan Alexandru tifui.alexandru Data 8 octombrie 2017 13:28:09
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>
#define Nmax 1001
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
list <int> G[Nmax];
int flow[Nmax][Nmax];
int cap[Nmax][Nmax];
bitset <Nmax> viz;
int t[Nmax];
queue <int> q;
int n;
bool BFS()
{
    int x;
    list <int> :: iterator it;
    q.push(1);
    for(x=1;x<=n;x++)
        viz[x]=false;
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        if(x==n) continue;
        for(it=G[x].begin();it!=G[x].end();it++)
        if(!viz[*it] and cap[x][*it]!=flow[x][*it])
        {
            viz[*it]=true;
            q.push(*it);
            t[*it]=x;
        }
    }
    return viz[n];
}
int main()
{
    int m,i,j,cost,k;
    f>>n>>m;
    for(k=1;k<=m;k++)
    {
        f>>i>>j>>cost;
        G[i].push_back(j);
        G[j].push_back(i);
        cap[i][j]=cost;
    }
    int ans=0,minn,x;
    list <int> :: iterator it;
    while(BFS())
        for(it=G[n].begin();it!=G[n].end();it++)
        {
            if(viz[*it] and flow[*it][n]!=cap[*it][n])
                t[n]=*it;
                minn=INT_MAX;
                x=n;
                while(x!=1)
                {
                    if(cap[t[x]][x]-flow[t[x]][x]<minn)
                        minn=cap[t[x]][x]-flow[t[x]][x];
                    x=t[x];
                }
            if(minn)
            {
                x=n;
                while(x!=1)
                {
                    flow[t[x]][x]+=minn;
                    flow[x][t[x]]-=minn;
                    x=t[x];
                }
            }
            ans+=minn;
        }
    g<<ans;

    return 0;
}