Cod sursa(job #1048442)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 5 decembrie 2013 21:30:54
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <cstdio>
#include <vector>
//#include <bitset>
//#include <queue>
#include <algorithm>
#include <utility>
#include <cstring>

using namespace std;

int cap[1005][1005];

//int pasi;
int flux,n;
//queue<int> coada;
//bool viz[1005];
int minim[1005];
int inapoi[1005];
vector<int> graf[1005];

int coada[1005], pasi;

//bitset<1005> viz;


inline bool bfs()
{

    int i;
    memset(inapoi,0,sizeof(inapoi));
    int st=1,dr=1;
    coada[1]=1;
    inapoi[1]=-1;

    int y;
    bool stop=false;
    while(st<=dr && !stop)
    {
        y=coada[st++];
        for(i=0; i<graf[y].size(); i++, pasi++)
        {
            if(cap[y][graf[y][i]])
                if(!inapoi[graf[y][i]])
                {
                    inapoi[graf[y][i]]=y;
                    if(graf[y][i]==n)
                    {
                        stop=true;
                        break;
                    }
                    coada[++dr]=graf[y][i];
                }
        }
    }

    if(!inapoi[n])
        return 0;
    return 1;
}

int main()
{
    //ifstream cin("maxflow.in");
    //ofstream cout("maxflow.out");
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);


    int m,i,a,b,c;
    //cin>>n>>m;
    scanf("%d%d",&n,&m);

    for(i=0; i<m; i++)
    {
        //cin>>a>>b>>c;
        scanf("%d%d%d",&a,&b,&c);

        graf[a].push_back(b);
        graf[b].push_back(a);
        cap[a][b]+=c;
    }

    int aux;
    while(bfs())
    {
        aux=n;
        int minim=110005;

        while(inapoi[aux]!=-1)
        {
            minim=min(minim,cap[inapoi[aux]][aux]);
            aux=inapoi[aux];
        }

        aux=n;
        while(inapoi[aux]!=-1)
        {
            cap[inapoi[aux]][aux]-=minim;
            cap[aux][inapoi[aux]]+=minim;
            aux=inapoi[aux];
        }

        flux+=minim;
    }

    //cout<<flux<<'\n';
    printf("%d\n",flux);
    //cin.close();
    //cout.close();
    return 0;
}