Cod sursa(job #2433514)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 27 iunie 2019 18:13:28
Problema Algola Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include<fstream>
#include<vector>
#include<deque>
using namespace std;
ifstream fi("algola.in");
ofstream fo("algola.out");
int n,i,j,a,b,x,y,nr,pax,add,nod,P[2605],C[2605][2605],F[2605][2605],dest,m,f;
vector<int> V[2605];
vector<int>::iterator it;
deque<int> Q;

bool bfs()
{
    int i;
    vector<int>::iterator it;
    for(i=1; i<=2601; i++)
        P[i]=0;
    int vf;
    Q.push_back(1);
    P[1]=-1;
    while(!Q.empty())
    {
        vf=Q.front();
        Q.pop_front();
        for(it=V[vf].begin(); it!=V[vf].end(); it++)
        {
            if(!P[*it] && C[vf][*it]!=F[vf][*it])
            {
                P[*it]=vf;
                Q.push_back(*it);
            }
        }
    }
    return P[dest];
}

int getnode(int nod, int t)
{
    return nod*51+t;
}

int main()
{
	fi>>n>>m;
    for(i=1; i<=n; i++)
    {
        fi>>x;
        b=getnode(i,0);
        a=1;
        V[a].push_back(b);
        V[b].push_back(a);
        C[a][b]=x;
        pax+=x;
    }
	for(i=1; i<=m; i++)
	{
        fi>>x>>y>>nr;
        for(j=0; j<50; j++)
        {
            a=getnode(x,j);
            b=getnode(y,j+1);
            V[a].push_back(b);
            V[b].push_back(a);
            C[a][b]=nr;
            a=getnode(y,j);
            b=getnode(x,j+1);
            V[a].push_back(b);
            V[b].push_back(a);
            C[a][b]=nr;
        }
	}
    for(i=1; i<=n; i++)
    {
        for(j=0; j<50; j++)
        {
            a=getnode(i,j);
            b=getnode(i,j+1);
            V[a].push_back(b);
            V[b].push_back(a);
            C[a][b]=50;
        }
    }
    dest=getnode(n+1,0);
    for(i=0; f<pax; i++)
    {
        a=getnode(1,i);
        b=dest;
        V[a].push_back(b);
        V[b].push_back(a);
        C[a][b]=50;
        while(bfs())
        {
            for(it=V[dest].begin(); it!=V[dest].end(); it++)
            {
                if(F[(*it)][dest]==C[(*it)][dest] || !P[(*it)])
                    continue;
                add=C[(*it)][dest]-F[(*it)][dest];
                nod=*it;
                while(nod!=1)
                {
                    add=min(add,C[P[nod]][nod]-F[P[nod]][nod]);
                    nod=P[nod];
                    if(add==0)
                        break;
                }
                if(add==0)
                    continue;
                f+=add;
                F[(*it)][dest]+=add;
                F[dest][(*it)]-=add;
                nod=*it;
                while(nod!=1)
                {
                    F[P[nod]][nod]+=add;
                    F[nod][P[nod]]-=add;
                    nod=P[nod];
                }
            }
        }
    }
    fo<<i-1<<"\n";
	fi.close();
    fo.close();
    return 0;
}