Cod sursa(job #1709321)

Utilizator PlayHPPet Rescue PlayHP Data 28 mai 2016 11:47:53
Problema Tribut Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.35 kb
#include <cstdio>
#include <cstring>
#define INF 1000000000
#define MAXN 100
int s, d;
int from[MAXN+1], q[MAXN+1], v[MAXN+1][MAXN+1], f[MAXN+1][MAXN+1], c[MAXN+1][MAXN+1], viz[MAXN+1];
inline int bfs(){
    int st, dr, p, x;
    st=0;
    dr=1;
    q[0]=s;
    memset(from, 0, sizeof from);
    memset(viz, 0, sizeof viz);
    viz[s]=1;
    while((st<dr)&&(viz[d]==0)){
        for(p=1; p<=v[q[st]][0]; p++){
            x=v[q[st]][p];
            if((viz[x]==0)&&(c[q[st]][x]>f[q[st]][x])){
                from[x]=q[st];
                viz[x]=1;
                q[dr++]=x;
            }
        }
        st++;
    }
    return viz[d];
}
int main(){
    int n, m, i, x, ans, min, p, t, k, j;
    FILE *fin, *fout;
    fin=fopen("tribut.in", "r");
    fout=fopen("tribut.out", "w");
    for(fscanf(fin, "%d", &t); t; t--){
        memset(f, 0, sizeof f);
        memset(c, 0, sizeof c);
        memset(v, 0, sizeof v);
        fscanf(fin, "%d%d", &n, &m);
        s=0;
        d=n+m+1;
        for(i=1; i<=n; i++){
            fscanf(fin, "%d", &c[s][i]);
            v[s][++v[s][0]]=i;
            v[i][++v[i][0]]=s;
        }
        for(i=1; i<=m; i++){
            fscanf(fin, "%d%d", &k, &c[i+n][d]);
            v[d][++v[d][0]]=i+n;
            v[i+n][++v[i+n][0]]=d;
            for(j=1; j<=k; j++){
                fscanf(fin, "%d", &x);
                v[x][++v[x][0]]=i+n;
                v[i+n][++v[i+n][0]]=x;
                c[x][i+n]=INF;
            }
        }
        ans=0;
        while(bfs()){
            for(p=1; p<=v[d][0]; p++){
                x=v[d][p];
                if((viz[x])&&(c[x][d]>f[x][d])){
                    from[d]=x;
                    min=INF;
                    i=d;
                    while(i!=s){
                        if(min>c[from[i]][i]-f[from[i]][i]){
                            min=c[from[i]][i]-f[from[i]][i];
                        }
                        i=from[i];
                    }
                    ans+=min;
                    i=d;
                    while(i!=s){
                        f[from[i]][i]+=min;
                        f[i][from[i]]-=min;
                        i=from[i];
                    }
                }
            }
        }
        fprintf(fout, "%d\n", ans);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}