首先我们发现答案是具有单调性的。而且每一天似乎只与上一天有关。那么我们可以枚举天数,建分层图,看什么时候可以了就是答案。我们一天一天的增加,每次新建这些边:S向新一天的地球建边,容量为inf,新一天的月球向T建边,容量为inf,上一天的空间站向新一天的空间站建边,容量为inf(表示留在空间站),每艘飞船上一天所在的空间站向新一天会到的空间站建边,容量为飞船大小。(表示可以转运那么多人),然后跑最大流判定就好啦。
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define N 150010
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,m,k,pos[22][20],r[22],a[22],h[N],num=1,lev[N],T=150001,cnt=0,mxflow=0;
struct edge{
int to,next,val;
}data[800000];
inline void add(int x,int y,int val){
data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val;
data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=0;
}
inline bool bfs(){
queue<int>q;memset(lev,0,sizeof(lev));
q.push(0);lev[0]=1;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=h[x];i;i=data[i].next){
int y=data[i].to;if(!data[i].val||lev[y]) continue;
lev[y]=lev[x]+1;q.push(y);
}
}return lev[T];
}
inline int dinic(int x,int low){
if(x==T) return low;int tmp=low;
for(int i=h[x];i;i=data[i].next){
int y=data[i].to;if(lev[y]!=lev[x]+1||!data[i].val) continue;
int res=dinic(y,min(tmp,data[i].val));
if(!res) lev[y]=0;tmp-=res;data[i].val-=res;data[i^1].val+=res;
if(!tmp) return low;
}return low-tmp;
}
int main(){
// freopen("a.in","r",stdin);
n=read();m=read();k=read();n+=2;
for(int i=1;i<=m;++i){
a[i]=read();r[i]=read();
for(int j=0;j<r[i];++j) pos[i][j]=read()+2;
}add(0,2,k);add(1,T,k);
while(1){
++cnt;add(0,n*cnt+2,k);add(n*cnt+1,T,k);
for(int i=1;i<=n;++i) add(n*(cnt-1)+i,n*cnt+i,inf);
for(int i=1;i<=m;++i)
add(n*(cnt-1)+pos[i][(cnt-1)%r[i]],n*cnt+pos[i][cnt%r[i]],a[i]);
while(bfs()) mxflow+=dinic(0,inf);
if(cnt>=1000){puts("0");return 0;}
if(mxflow>=k) break;
}printf("%d\n",cnt);return 0;
}