Cod sursa(job #1099249)

Utilizator andreiiiiPopa Andrei andreiiii Data 5 februarie 2014 18:14:20
Problema Algola Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <algorithm>
#include <cstdio>
#include <bitset>
#include <vector>
#include <queue>
#define mp make_pair
#define PII pair<int, int>
#define x first
#define y second

using namespace std;

const int N=55, M=5005, INF=0x3f3f3f3f;

int n, flow;
int a[N], C[M][M], F[M][M], Tr[M];
vector <PII> MC[N];
vector <int> G[M];
bitset <M> v;

void build(int m)
{
    int i;
    for(i=1;i<=n;i++)
    {
        G[n*(m-1)+i].push_back(n*m+i);
        G[n*m+i].push_back(n*(m-1)+i);
        C[n*(m-1)+i][n*m+i]=200;
        for(auto p: MC[i])
        {
            G[n*(m-1)+i].push_back(n*m+p.x);
            G[n*m+p.x].push_back(n*(m-1)+i);
            C[n*(m-1)+i][n*m+p.x]=p.y;
        }
    }
}

bool bfs(int m)
{
    int x;
    queue <int> Q;
    v.reset();
    v[0]=1;
    for(Q.push(0);!Q.empty();Q.pop())
    {
        x=Q.front();
        for(auto p: G[x])
        {
            if(v[p]||C[x][p]==F[x][p]) continue;
            Q.push(p);
            v[p]=1;
            Tr[p]=x;
        }
    }
    return v[n*m+1];
}

void get_flow(int m)
{
    int d=n*m+1, fmin, i;
    while(bfs(m))
    {
        for(auto p: G[d])
        {
            if(!v[p]||C[p][d]==F[p][d]) continue;
            Tr[d]=p;
            fmin=INF;
            for(i=d;i;i=Tr[i])
            {
                fmin=min(fmin, C[Tr[i]][i]-F[Tr[i]][i]);
            }
            if(!fmin) continue;
            for(i=d;i;i=Tr[i])
            {
                F[Tr[i]][i]+=fmin;
                F[i][Tr[i]]-=fmin;
            }
            flow+=fmin;
        }
    }
}

int main()
{
    freopen("algola.in", "r", stdin);
    freopen("algola.out", "w", stdout);
    int m, i, x, y, z, s=0;
    scanf("%d%d", &n, &m);
    for(i=1;i<=n;i++)
    {
        scanf("%d", &a[i]);
        s+=a[i];
        G[0].push_back(i);
        G[i].push_back(0);
        C[0][i]=a[i];
    }
    while(m--)
    {
        scanf("%d%d%d", &x, &y, &z);
        MC[x].push_back(mp(y, z));
        MC[y].push_back(mp(x, z));
    }
    for(i=1;flow<s;i++)
    {
        build(i);
        get_flow(i);
    }
    printf("%d", i-1);
}