1 条题解
-
0
#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
- 上传者