Cod sursa(job #1114957)

Utilizator assa98Andrei Stanciu assa98 Data 21 februarie 2014 19:57:13
Problema Algola Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>

#define pe pair<int,int>
#define mp make_pair
#define fi first
#define se second

using namespace std;

const int MAX_N=50;
const int INF=100;
const int MAX_V=5100;
int n;

vector<pe> A[MAX_N];
vector<int> G[MAX_V];

short cap[MAX_V][MAX_V];
short flux[MAX_V][MAX_V];
int D;

void graf(int T) {
    D=T*n+1;
    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);
        cap[n*(T-1)+i][n*T+i]=INF;
    }
    for(int i=1;i<=n;i++) {
        for(auto it=A[i].begin(); it!=A[i].end(); it++) {
            G[n*(T-1)+i].push_back(n*T + it->fi);
            G[n*T + it->fi].push_back(n*(T-1)+i);
            cap[n*(T-1)+i][n*T+ it->fi]=it->se;
        }
    }
}

bool viz[MAX_V];
int dad[MAX_V];

bool bfs() {
    memset(viz,0,sizeof(viz));
    memset(dad,0,sizeof(dad));
    queue<int> Q;
    Q.push(0);
    viz[0]=true;
    while(!Q.empty()) {
        int nod=Q.front();
        Q.pop();
        if(nod==D) {
            continue;
        }
        for(auto it=G[nod].begin(); it!=G[nod].end(); it++) {
            if(!viz[*it]&&flux[nod][*it]<cap[nod][*it]) {
                viz[*it]=true;
                dad[*it]=nod;
                Q.push(*it);
            }
        }
    }
    return viz[D];
}

int ans;
void flow() {
    while(bfs()) {
        for(auto it=G[D].begin(); it!=G[D].end(); it++) {
            if(!viz[*it]||flux[*it][D]>=cap[*it][D]) {
                continue;
            }
            dad[D]=*it;
            int mflow=12;
            for(int nod=D;nod;nod=dad[nod]) {
                mflow=min(mflow,cap[dad[nod]][nod]-flux[dad[nod]][nod]);
            }
            ans+=mflow;
            for(int nod=D;nod;nod=dad[nod]) {
                flux[dad[nod]][nod]+=mflow;
                flux[nod][dad[nod]]-=mflow;
            }
        }
    }
}

int main() {
    freopen("algola.in","r",stdin);
    freopen("algola.out","w",stdout);
    
    int m;
    int sum=0;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) {
        int c;
        scanf("%d",&c);
        G[0].push_back(i);
        G[i].push_back(0);
        cap[0][i]=c;
        sum+=c;
    }

    for(int i=1;i<=m;i++) {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        A[a].push_back(mp(b,c));
        A[b].push_back(mp(a,c));
    }
    
    int t;
    for(t=1;ans<sum;t++) {
        graf(t);
        flow();
    }

    printf("%d",t-1);

    return 0;
}