Nu aveti permisiuni pentru a descarca fisierul grader_test8.in
Cod sursa(job #1709321)
Utilizator | 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;
}