Cod sursa(job #1114615)

Utilizator assa98Andrei Stanciu assa98 Data 21 februarie 2014 19:17:31
Problema Algola Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 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=5010;
int n;

int sum;

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

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

inline int gnod(int nod,int t) {
    return n*t+nod;
}

inline void add(int n1,int n2,int t,int c) {
    int a=gnod(n1,t),b=gnod(n2,t+1); 
    G[a].push_back(b);
    G[b].push_back(a);
    cap[a][b]+=c;
}

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

inline bool check(int t) {
    graf(t);
    flow();
    if(ans==sum) {
        return true;
    }
    return false;
}

int search() {
    int t;
    for(t=1;!check(t);t++);
    return t-1;
}


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

    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));
    }
    
    printf("%d",search());

    return 0;
}