Cod sursa(job #1048436)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 5 decembrie 2013 21:20:17
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 3.48 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()
{

    fprintf(stderr, "3123123");
    int i;
    //cout<<"bfs()"<<endl;
    //for(i=1;i<=n;i++)
    //    viz[i]=0;
    memset(inapoi,0,sizeof(inapoi));
    int st=1,dr=1;
    coada[1]=1;
    //viz[1]=1;
    //minim[1]=110005;
    inapoi[1]=-1;

    fprintf(stderr, "da");
    //vector<int>::iterator it;
    int y;
    bool stop=false;
    while(st<=dr && !stop)
    {
        //    cerr<<"prost!"<<endl;
        y=coada[st++];
        //cout<<"se scoate "<<y<<endl;
        //for(i=s1;i<=n;i++)
        //{
        //cout<<i<<' ';

        fprintf(stderr, "opa");
        for(i=0; i<graf[y].size(); i++, pasi++)
        {
            //pasi++;
            if(cap[y][graf[y][i]])
                if(!inapoi[graf[y][i]])
                {

                    fprintf(stderr, "intru\n");
                    //pasi++;
                    inapoi[graf[y][i]]=y;

                    fprintf(stderr, "probabil");
                    //minim[graf[y][i]]=min(cap[y][graf[y][i]],minim[y]);
                    //viz[*it]=1;

                    fprintf(stderr, " -----da-----");
                    if(graf[y][i]==n)
                    {

                        fprintf(stderr, "iesit");
                        stop=true;
                        break;
                    }

                    fprintf(stderr, "------nu-----");
                    //coada.push(*it);

                    fprintf(stderr, "nunu");
                    coada[++dr]=graf[y][i];

                    fprintf(stderr, "ies\n");
                }
        }
        //cout<<endl;
    }

    //while(!coada.empty())
    //    coada.pop();
    //cout<<endl;

    fprintf(stderr, "ura!");
    if(!inapoi[n])
        return 0;

    fprintf(stderr, "nuuuuuuuuuuuuuuu");
    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())
    {
        //cerr<<"oribil!"<<endl;
        aux=n;
        int minim=110005;

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

            fprintf(stderr, "%d",aux);
            fprintf(stderr, "primul while");
        }

        fprintf(stderr, "334");
        aux=n;
        while(inapoi[aux]!=-1)
        {
            //cout<<"da"<<endl;
            cap[inapoi[aux]][aux]-=minim;
            cap[aux][inapoi[aux]]+=minim;
            aux=inapoi[aux];
            // cerr<<"inadmisibil"<<endl;
            //  cerr<<aux<<endl;
            fprintf(stderr, "al doilea while");
        }

        fprintf(stderr, "335");
        flux+=minim;
    }
    //cerr<<pasi<<endl;
    //cout<<flux<<'\n';
    printf("%d\n",flux);
    //cin.close();
    //cout.close();
    return 0;
}