Cod sursa(job #1710428)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 28 mai 2016 22:33:53
Problema Tribut Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.22 kb
#include<cstdio>
#include<cstring>
#define INF 1000000000
#define MAXN 202
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(){
    freopen("tribut.in","r",stdin);
    freopen("tribut.out","w",stdout);
    int n,m,i,x,ans,min,p,t,k,j,test,tests;
    scanf("%d",&tests);
    for(test=1;test<=tests;test++){
        memset(f,0,sizeof(f));
        memset(c,0,sizeof(c));
        memset(v,0,sizeof(v));
        scanf("%d%d",&n,&m);
        s=0;
        d=n+m+1;
        for(i=1;i<=n;i++){
            scanf("%d",&c[s][i]);
            v[s][++v[s][0]]=i;
            v[i][++v[i][0]]=s;
        }
        for(i=1;i<=m;i++){
            scanf("%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++){
                scanf("%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];
                    }
                }
            }
        printf("%d\n", ans);
    }
    return 0;
}