Cod sursa(job #2327612)

Utilizator MAXIMILLIANMUSOHYEAHYEAH MAXIMILLIANMUS Data 24 ianuarie 2019 19:36:59
Problema Algola Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.33 kb
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
 
using namespace std;
 
queue<int> q;
int vaz[5100],tata[5100],n,dest;
char cap_flow[5100][5100];
vector<int> v[5100];
vector<pair<int,int>> g[60];
 
int bfs()
{
    for(int i=0;i<=dest;i++) vaz[i]=0;
    q.push(0);
    vaz[0]=1;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        for(int i=0;i<v[nod].size();i++)
        {
            int vec=v[nod][i];
            if(vaz[vec]==1 or cap_flow[nod][vec]==0) continue;
            vaz[vec]=1;
            tata[vec]=nod;
            if(vec!=dest) q.push(vec);
        }
    }
    return vaz[dest];
}
 
int main()
{
    freopen("algola.in","r",stdin);
    freopen("algola.out","w",stdout);
    int m,sol=0,x,y,c,lim=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        lim+=x;
        v[0].push_back(i);
        v[i].push_back(0);
        cap_flow[0][i]=x;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        g[x].push_back({y,c});
        g[y].push_back({x,c});
    }
    int flow=0;
    while(flow<lim)
    {
        dest=sol*n+1;
        while(bfs())
        {
            for(int i=0;i<v[dest].size();i++)
            {
                int vec=v[dest][i];
                if(vaz[vec]==0 or cap_flow[vec][dest]==0) continue;
                tata[dest]=vec;
                char s=100;
                for(int nod=dest;nod!=0;nod=tata[nod]) s=min(s,cap_flow[tata[nod]][nod]);
                for(int nod=dest;nod!=0;nod=tata[nod])
                {
                    cap_flow[tata[nod]][nod]-=s;
                    cap_flow[nod][tata[nod]]+=s;
                }
                flow+=s;
            }
        }
        if(flow==lim) break;
        for(int i=1;i<=n;i++)
        {
            v[i+sol*n].push_back(i+(sol+1)*n);
            v[i+(sol+1)*n].push_back(i+sol*n);
            cap_flow[i+sol*n][i+(sol+1)*n]=100;
            for(int j=0;j<g[i].size();j++)
            {
                int vec=g[i][j].first,c=g[i][j].second;
                v[i+sol*n].push_back(vec+(sol+1)*n);
                v[vec+(sol+1)*n].push_back(i+sol*n);
                cap_flow[i+sol*n][vec+(sol+1)*n]=c;
            }
        }
        sol++;
    }
    printf("%d",sol);
    return 0;
}