int@n,@m,@a[n][n],b[n]; rep(y,n){ if(sum[x,0,n](a[y][x])!=m){ wt(-1); exit(0); } } rep(x,n){ if(sum[y,0,n](a[y][x])!=m){ wt(-1); exit(0); } } maxflowf; f.malloc(2n+2,1); int st=2n; int ed=st+1; rep(y,n){ f.addEdge(st,y,1); } rep(x,n){ f.addEdge(n+x,ed,1); } rep(y,n){ rep(x,n){ if(a[y][x]){ f.addEdge(y,n+x,a[y][x]); } } } rep(m){ int dd=f.solve(st,ed); rep(y,n){ rep(i,1,f.es[y]){ int x=f.edge[y][i]; int r=f.rev[y][i]; if(f.flow[x][r]){ f.flow[x][r]=0; b[y]=x-n+1; } } } wt(b(n)); rep(y,n){ f.flow[st][y]=1; f.flow[y][0]=0; } rep(x,n){ f.flow[ed][x]=0; f.flow[n+x][0]=1; } }