Cod sursa(job #1999452)

Utilizator refugiatBoni Daniel Stefan refugiat Data 11 iulie 2017 08:49:44
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <bits/stdc++.h>
#define MAXN 5005
#define start 0
#define fin 5001
#define INF 70
using namespace std;
ifstream si("algola.in");
ofstream so("algola.out");
bool viz[MAXN];
vector<pair<int,int> >g[MAXN];
vector<int >v[MAXN];
int cap[MAXN][MAXN],flow[MAXN][MAXN];
int tata[MAXN],nod,fnew,maxf;
void add(int x,int y,int c)
{
    v[x].push_back(y);
    v[y].push_back(x);
    cap[x][y]=c;
}
queue<int> q;
bool bfs()
{
    memset(viz,false,sizeof(viz));
    q.push(start);
    viz[start]=true;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        if(nod==fin)
            continue;
        for(auto it:v[nod])
        {
            if(!viz[it]&&flow[nod][it]<cap[nod][it])
            {
                viz[it]=true;
                q.push(it);
                tata[it]=nod;
            }
        }
    }
    return viz[fin];
}
int solve()
{
    int rez=0;
    while(bfs())
    {
        for(auto it:v[fin])
        {
            if(viz[it]&&flow[it][fin]!=cap[it][fin])
            {
                tata[fin]=it;
                int fnou=INF;
                for(int nod=fin;nod!=start;nod=tata[nod])
                {
                    fnou=min(fnou,cap[tata[nod]][nod]-flow[tata[nod]][nod]);
                }
                rez+=fnou;
                for(int nod=fin;nod!=start;nod=tata[nod])
                {
                    flow[tata[nod]][nod]+=fnou;
                    flow[nod][tata[nod]]-=fnou;
                }
            }
        }
    }
    return rez;
}
int main()
{
    int n,m;
    si>>n>>m;
    int sum=0;
    int x;
    for(int i=1;i<=n;++i)
    {
        si>>x;
        sum+=x;
        add(start,i,x);
    }
    int y,z;
    for(int i=1;i<=m;++i)
    {
        si>>x>>y>>z;
        g[x].push_back({y,z});
        g[y].push_back({x,z});
    }
    add(1,fin,INF);
    int sol=0;
    maxf=solve();
    while(maxf<sum)
    {
        //cout<<maxf<<' ';
        sol++;
        for(int i=1;i<=n;++i)
        {
            add(n*(sol-1)+i,n*sol+i,INF);
            for(auto it:g[i])
            {
                add(n*(sol-1)+i,n*sol+it.first,it.second);
            }
        }
        add(n*sol+1,fin,INF);
        maxf+=solve();
    }
    so<<sol;
    return 0;
}