#include<cstdio>
#define MAXN 8000010
#define MAX(A,B) ((A)>(B)?(A):(B))
int sl,fh;
int read(){
sl=0;fh=1;
char ch=getchar();
while(ch<'0'||'9'<ch) {if(ch=='-') fh=-1; ch=getchar();}
while('0'<=ch&&ch<='9') sl=sl*10+ch-'0',ch=getchar();
return sl*fh;
}
int to[MAXN], nxt[MAXN], head[305], top;
void add(int now,int tow){to[++top]=tow;nxt[top]=head[now];head[now]=top;}
int vis[MAXN], use[MAXN], id=1;
int priority[305], ans[305], f[305];
int fans;
int like[305][205], arc_bon[MAXN];
bool flag=0;
bool dfs(int x){
for (int i=head[x];i!=0;i=nxt[i]){
int ver=to[i];
if(like[x][arc_bon[ver]]!=priority[x]){continue;}
if(vis[ver]!=id){
vis[ver]=id;
if(!flag)fans=MAX(use[ver],fans);
if(use[ver]==0||dfs(use[ver])){use[ver]=x;return 1;}
}
}
return 0;
}
int tot, n, m;
int bon[305][2];
void init(){
for(int i=1;i<=top;i++){vis[i]=0;use[i]=0;}
for(int i=1;i<=tot;i++){arc_bon[i]=0;}
for(int i=1;i<=n;i++){head[i]=0;bon[i][0]=0;bon[i][1]=0;priority[i]=0;ans[i]=0;f[i]=0;for(int j=1;j<=m;j++){like[i][j]=0;}}
for(int i=1;i<=top;i++){to[i]=0;nxt[i]=0;}
top=0;id=1;tot=0;
}
signed main(){
int t, c;t=read();c=read();
while(t--){a
n=read();m=read();
for(int i=1, te;i<=m;i++){
te=read();
bon[i][0]=tot+1;
for(int j=1;j<=te;j++){arc_bon[++tot]=i;}
bon[i][1]=tot;
}
for(int i=1, ch;i<=n;i++){
for(int j=1;j<=m;j++){
ch=read();
if(ch){
for(int k=bon[j][0];k<=bon[j][1];k++){
add(i,k);
}
like[i][j]=ch;
}
}
}
for(int i=1;i<=n;i++){
f[i]=read();
}
for(int i=1;i<=n;i++){
priority[i]=1;
while(1){
if(dfs(i)){if(priority[i]<=f[i]){fans=-1;};printf("%d ",priority[i]);id++;break;}
if(priority[i]>=f[i]){flag=1;}
id++;
priority[i]++;
if(priority[i]==m+1){printf("%d ", m+1);break;}
}
ans[i]=fans;
flag=0;
fans=0;
}
puts("");
for(int i=1;i<=n;i++){
if(!ans[i]){printf("%d ", i);}
else if(ans[i]==-1){printf("%d ",0);}
else{printf("%d ", i-ans[i]);}
}
puts("");
init();
}
return 0;
}
最后两个点t了,求可行的解决办法。 谢谢