Cod sursa(job #1966860)

Utilizator LucianTLucian Trepteanu LucianT Data 15 aprilie 2017 16:56:03
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <bits/stdc++.h>
#define maxN 5005
using namespace std;
int source=0,sink=5001;
const int INF=70;

bool seen[maxN];
vector<pair<int,int> >g[maxN];
vector<int >v[maxN];
int cap[maxN][maxN],flow[maxN][maxN];
int tata[maxN],nod,addflow,maxflow;

int n,m,i,j,x,y,z;

void addedge(int x,int y,int c)
{
    v[x].push_back(y);
    v[y].push_back(x);
    cap[x][y]=c;
}

queue<int>Que;
bool bfs()
{
    memset(seen,false,sizeof(seen));

    Que.push(source);
    seen[source]=true;

    while(!Que.empty())
    {
        int nod=Que.front();
        Que.pop();
        if(nod==sink)
            continue;

        for(auto it:v[nod])
            if(!seen[it] && flow[nod][it]<cap[nod][it])
            {
                seen[it]=true;
                Que.push(it);
                tata[it]=nod;
            }
    }
    return seen[sink];
}
int getMaxFlow()
{
    int res=0;

    while(bfs())
        for(auto it:v[sink])
            if(seen[it] && flow[it][sink]!=cap[it][sink])
            {
                tata[sink]=it;
                int addflow=INF;
                for(nod=sink;nod!=source;nod=tata[nod])
                    addflow=min(addflow,cap[tata[nod]][nod]-flow[tata[nod]][nod]);

                res+=addflow;
                for(nod=sink;nod!=source;nod=tata[nod])
                    flow[tata[nod]][nod]+=addflow,
                    flow[nod][tata[nod]]-=addflow;
            }
    return res;
}
int main()
{
    freopen("algola.in","r",stdin);
    freopen("algola.out","w",stdout);
    scanf("%d %d",&n,&m);
    int total=0;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        total+=x;
        addedge(source,i,x);
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d %d %d",&x,&y,&z);
        g[x].push_back({y,z});
        g[y].push_back({x,z});
    }
    addedge(1,sink,INF);

    int sol=0;
    maxflow=getMaxFlow();
    while(maxflow<total)
    {
        sol++;
        for(i=1;i<=n;i++)
        {
            addedge(n*(sol-1)+i,n*sol+i,INF);
            for(auto it:g[i])
                addedge(n*(sol-1)+i,n*sol+it.first,it.second);
        }
        addedge(sol*n+1,sink,INF);
        maxflow+=getMaxFlow();
    }

    printf("%d",sol);
    return 0;
}