Cod sursa(job #2024761)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 21 septembrie 2017 10:04:13
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
using namespace std;
FILE *f=fopen("algola.in","r");
FILE *g=fopen("algola.out","w");
vector<int> G[5105];
vector<pair<int,int> > gg[55];
int C[5105][5105];
int F[5105][5105];
int S=0,D=5100;
int stq,drq;
int Q[5105];
int T[5105];
bool viz[5105];
bool BFS(int S,int D)
{
    memset(viz,0,sizeof(viz));
    viz[S]=1;
    stq=drq=1;
    Q[1]=S;
    while(stq<=drq)
    {
        int nod=Q[stq++];
        if(nod==D)continue;
        for(auto it:G[nod])
        {
            if(F[nod][it]<C[nod][it]&&!viz[it])
            {
                viz[it]=1;
                T[it]=nod;
                Q[++drq]=it;
            }
        }
    }
    return viz[D];
}
int flow=0;
int maxflow(int S,int D)
{
    while(BFS(S,D))
    {
        for(auto it:G[D])
        {
            if(F[it][D]<C[it][D]&&viz[it])
            {
                T[D]=it;
                int fmin=1<<30;
                for(int nod=D;nod!=S;nod=T[nod])fmin=min(fmin,C[T[nod]][nod]-F[T[nod]][nod]);
                if(!fmin)continue;
                flow+=fmin;
                for(int nod=D;nod!=S;nod=T[nod]){F[T[nod]][nod]+=fmin;F[nod][T[nod]]-=fmin;}
            }
        }
    }
    return flow;
}
int N,M;
int OFF=0;
int rez=0;
int main()
{
    fscanf(f,"%d %d",&N,&M);
    for(int i=1;i<=N;i++)
    {
        int a=0;
        fscanf(f,"%d",&a);rez+=a;
        G[S].push_back(i);
        G[i].push_back(S);
        C[S][i]=a;
    }
    C[1][D]=1<<29;
    OFF=N;
    G[1].push_back(D);
    G[D].push_back(1);
    for(int i=1;i<=M;i++)
    {
        int x,y,l;
        fscanf(f,"%d %d %d",&x,&y,&l);
        gg[x].push_back({y,l});
        gg[y].push_back({x,l});
    }
    int t=0;
    while(rez!=maxflow(S,D))
    {
        for(int i=1;i<=N;i++)
        {
            for(auto it:gg[i])
            {
                C[i+OFF-N][it.first+OFF]=it.second;
                G[i+OFF-N].push_back(it.first+OFF);
                G[it.first+OFF].push_back(i+OFF-N);
            }
            C[i+OFF-N][i+OFF]=1<<29;
            G[i+OFF-N].push_back(i+OFF);
            G[i+OFF].push_back(i+OFF-N);
        }
        G[OFF+1].push_back(D);
        G[D].push_back(OFF+1);
        C[OFF+1][D]=1<<29;
        OFF+=N;
        t++;
    }
    fprintf(g,"%d",t);
    fclose(f);
    fclose(g);
    return 0;
}