1 条题解

  • 0
    @ 2026-2-7 19:18:10
    #include<cstdio>
    #include<cstring>
    using  namespace  std;
    struct  node
    {
    	int  y,c,next,other;
    }a[210000];int  last[21000],len;
    int  n,m,k,fa[30],st,ed,stl[30],f[30][30],ttl[30];
    int  findfa(int  x)
    {
    	if(fa[x]==x)return  x;
    	return  fa[x]=findfa(fa[x]);
    }
    int  zhuan(int  b,int  a){return  a*n+b+1;}
    int  list[21000],head,tail,h[21000];
    bool  bt()
    {
    	memset(h,0,sizeof(h));h[st]=1;
    	head=1;tail=2;list[head]=st;
    	while(head!=tail)
    	{
    		int  x=list[head];
    		for(int  k=last[x];k;k=a[k].next)
    		{
    			int  y=a[k].y;
    			if(a[k].c>0  &&  h[y]==0)
    			{
    				h[y]=h[x]+1;
    				list[tail++]=y;
    			}
    		}
    		head++;
    	}
    	return  h[ed]!=0;
    }
    int  mymin(int  x,int  y){return  x<y?x:y;}
    int  find(int  x,int  f)
    {
    	if(x==ed)return  f;
    	int  ans=0,t=0;
    	for(int  k=last[x];k;k=a[k].next)
    	{
    		int  y=a[k].y;
    		if(a[k].c>0  &&  ans<f  &&  h[y]==h[x]+1)
    		{
    			ans+=t=find(y,mymin(a[k].c,f-ans));
    			a[k].c-=t;a[a[k].other].c+=t;
    		}
    	}
    	if(ans==0)h[x]=0;
    	return  ans;
    }
    void  ins(int  x,int  y,int  c)
    {
    	len++;
    	a[len].y=y;a[len].c=c;a[len].next=last[x];last[x]=len;
    	len++;
    	a[len].y=x;a[len].c=0;a[len].next=last[y];last[y]=len;
    	a[len].other=len-1;
    	a[len-1].other=len;
    }
    int  main()
    {
    	ed=1;scanf("%d%d%d",&n,&m,&k);
    	n+=2;
    	for(int  i=1;i<=n;i++)fa[i]=i;
    	for(int  i=1;i<=m;i++)
    	{
    		scanf("%d%d",&ttl[i],&f[i][0]);
    		for(int  j=1;j<=f[i][0];j++)
    		{
    			scanf("%d",&f[i][j]);
    			f[i][j]+=2;
    		}
    		for(int  j=2;j<=f[i][0];j++)
    		{
    			int  tx=findfa(f[i][j-1]),ty=findfa(f[i][j]);
    			if(tx!=ty)fa[tx]=ty;
    		}
    		stl[i]=1;
    	}
    	int  tx=findfa(1),ty=findfa(2);
    	if(tx!=ty)printf("0\n");
    	else
    	{
    		int  time=-1,ans=0;
    		while(ans<k)
    		{
    			time++;
    			if(time!=0)
    			{
    				for(int  i=1;i<=m;i++)
    				{
    					int  behind=stl[i];
    					stl[i]++;if(stl[i]==f[i][0]+1)stl[i]=1;
    					ins(zhuan(f[i][behind],time-1),zhuan(f[i][stl[i]],time),ttl[i]);
    				}
    				for(int  i=1;i<=n;i++)ins(zhuan(i,time-1),zhuan(i,time),9999999);
    			}
    			ins(st,zhuan(2,time),9999999);
    			ins(zhuan(1,time),ed,9999909);
    			while(bt())
    			{
    				ans+=find(st,9999999);
    			}
    		}
    		printf("%d\n",time);
    	}
    	return  0;
    }
    
    • 1

    信息

    ID
    970
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    3
    上传者