Cod sursa(job #1067718)

Utilizator dariusdariusMarian Darius dariusdarius Data 27 decembrie 2013 14:04:07
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<cstdio>
#include<cstring>
#include<cassert>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct Edge {int x,y,c;} a[305];
int A[55];
int N,M,Oameni,D;
short C[5005][5005];
short F[5005][5005];
int p[5005];
vector<int> G[5005];
vector< pair<int,int> > E[5005];
int MaxFlow;
int BFS()
{
    for(int i=1;i<=D;i++)
        p[i]=-1;
    queue<int> Q;
    p[0]=-2;Q.push(0);
    while(!Q.empty())
    {
        int u=Q.front();
        for(vector<int>::iterator it=G[u].begin();it!=G[u].end();it++)
            if(p[*it]==-1 && F[u][*it]<C[u][*it])
            {
                Q.push(*it);
                p[*it]=u;
            }
        Q.pop();
    }
    if(p[D]!=-1)
        return 1;
    return 0;
}
void Build(int T)
{
    for(int i=1;i<=N;i++)
    {
        G[N*(T-1)+i].push_back(N*T+i);
        G[N*T+i].push_back(N*(T-1)+i);
        C[N*(T-1)+i][N*T+i]=200;
        for(vector< pair<int,int> >::iterator it=E[i].begin();it!=E[i].end();it++)
        {
            G[N*(T-1)+i].push_back(N*T+it->first);
            G[N*T+it->first].push_back(N*(T-1)+i);
            C[N*(T-1)+i][N*T+it->first]=it->second;
        }
    }
}
void AddFlow(int T)
{
    Build(T);
    D=T*N+1;
    while(BFS())
    {
        int MinFlow=C[p[D]][D]-F[p[D]][D];
        for(int u=p[D];u;u=p[u])
            MinFlow=min(MinFlow,C[p[u]][u]-F[p[u]][u]);
        for(int u=D;u;u=p[u])
        {
            F[p[u]][u]+=MinFlow;
            F[u][p[u]]-=MinFlow;
        }
        MaxFlow+=MinFlow;
    }
}
int main()
{
    freopen("algola.in","r",stdin);
    freopen("algola.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;i++)
    {
        scanf("%d",&A[i]);
        Oameni+=A[i];
        G[0].push_back(i);
        G[i].push_back(0);
        C[0][i]=A[i];
    }
    for(int a,b,c,i=1;i<=M;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        E[a].push_back(make_pair(b,c));
        E[b].push_back(make_pair(a,c));
    }
    int t;
    for(t=1;MaxFlow<Oameni;t++)
        AddFlow(t);
    printf("%d\n",t-1);
    return 0;
}