program flow13; const maxn=1000; var g:array[-1..maxn,-1..maxn]of longint; d,que:array[-1..maxn]of longint; v:array[-1..maxn]of boolean; ship:array[1..20,0..40]of longint; num,r:array[1..20]of longint; n,m,max,tot:longint; function min(a,b:longint):longint; begin if a<b then exit(a) else exit(b); end; function bfs(s,t,tot:longint):boolean; var l,r,i,u:longint; begin fillchar(que,sizeof(que),0); fillchar(d,sizeof(d),0); fillchar(v,sizeof(v),false); l:=0;r:=1;que[l]:=s;v[s]:=true; while l<r do begin u:=que[l]; for i:=-1 to tot do if (g[u][i]>0)and(not v[i])then begin que[r]:=i; inc(r); d[i]:=d[u]+1; v[i]:=true; end; if (g[u][t]>0)and(not v[t]) then begin que[r]:=i; inc(r); d[t]:=d[u]+1; v[t]:=true; end; inc(l); end; exit(v[t]); end; function dfs(p,a,t,tot:longint):longint; var f,flow,i:longint; begin if (p=t)or(a=0) then exit(a); flow:=0; for i:=-1 to tot do if (g[p][i]>0)and(d[i]=d[p]+1)then begin f:=dfs(i,min(a,g[p][i]),t,tot); if f=0 then continue; inc(flow,f); inc(g[i][p],f); dec(g[p][i],f); dec(a,f); if a=0 then break; end; if (g[p][t]>0)and(d[t]=d[p]+1)then begin f:=dfs(t,min(a,g[p][t]),t,tot); inc(flow,f); inc(g[i][p],f); dec(g[p][i],f); dec(a,f); end; exit(flow); end; function dinic(s,t,tot:longint):longint; var ans:longint; begin ans:=0; while bfs(s,t,tot) do ans:=ans+dfs(s,maxlongint,t,tot); exit(ans); end; procedure init; var i,j,flow,t,add,w,u,v,maxt,ans:longint; begin read(n,m,max); fillchar(g,sizeof(g),255); maxt:=0; for i:=1 to m do begin read(r[i]); read(num[i]); if maxt<num[i] then maxt:=num[i]; for j:=0 to num[i]-1 do read(ship[i][j]); end; inc(n,2); g[-1][0]:=maxlongint; g[0][-1]:=0; g[n-1][maxn]:=maxlongint; g[maxn][n-1]:=0; t:=0;tot:=0; while true do begin inc(t); add:=t*n; g[-1][add]:=maxlongint; g[add][-1]:=0; g[n-1+add][maxn]:=maxlongint; g[maxn][n-1+add]:=0; for i:=1 to n-2 do begin g[i+add-n][i+add]:=maxlongint; g[i+add][i+add-n]:=0; end; for i:=1 to m do begin w:=t mod num[i]; u:=ship[i][(w+num[i]-1)mod num[i]]; v:=ship[i][w]; if u=-1 then u:=n-1; if v=-1 then v:=n-1; g[u+add-n][v+add]:=r[i]; g[v+add][u+add-n]:=0; end; ans:=dinic(-1,maxn,add+n-1); tot:=tot+ans; if tot>=max then break; if (t>maxt shl 1)and(tot=0) then begin writeln(0);exit;end; end; writeln(t); end; begin assign(input,'f.in');reset(input); init; close(input); end.
评论