Cod sursa(job #1282981)

Utilizator george_stelianChichirim George george_stelian Data 4 decembrie 2014 22:10:20
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <cstdio>
#include <queue>
#include <vector>

using namespace std;

const int inf=55;
vector<int> v[5010];
vector<pair<int,int> >ginit[55];
char cap[5010][5010];
short flow[5010][5010],tata[5010];
int n,dest;

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

int dfs()
{
    queue<int> q;
    for(int i=0;i<dest+n;i++) tata[i]=-1;
    q.push(0);
    tata[0]=0;
    while(!q.empty())
    {
        int nod=q.front();q.pop();
        for(vector<int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
            if(tata[*it]==-1 && cap[nod][*it]>flow[nod][*it])
            {
                tata[*it]=nod;
                if(nod!=dest) q.push(*it);
            }
    }
    return tata[dest]!=-1;
}

int main()
{
    freopen("algola.in", "r", stdin);
    freopen("algola.out", "w", stdout);
    int m,x,y,c,s=0,maxflow=0,t;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        add_edge(0,i,x);
        s+=x;
    }
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        ginit[x].push_back(make_pair(y,c));
        ginit[y].push_back(make_pair(x,c));
    }
    for(t=1;maxflow<s;t++)
    {
        dest=n*t+1;
        for(int i=1;i<=n;i++)
        {
            add_edge(n*(t-1)+i , n*t+i , inf);
            for(vector<pair<int,int> >::iterator it=ginit[i].begin();it!=ginit[i].end();it++) add_edge(n*(t-1)+i , n*t+it->first , it->second);
        }
        while(dfs())
        {
            int x=inf;
            for(int i=dest;i;i=tata[i]) x=min(x,cap[tata[i]][i]-flow[tata[i]][i]);
            for(int i=dest;i;i=tata[i])
            {
                flow[tata[i]][i]+=x;
                flow[i][tata[i]]-=x;
            }
            maxflow+=x;
        }
    }
    printf("%d",t-1);
    return 0;
}