rt,把测试点 #11 下载下来然后测了,是 dfs 中的死循环(也可能是建图建错了?),但是看不出问题。
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,k,S,T,ans;
int fa[55],h[55],s[55][55],r[55],dis[800005];
int head[800005],cnt=1;
struct edge{
int v,w,nxt;
}E[1000005];
int find(int x) {
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void add(int u,int v,int w) {
E[++cnt]=(edge){v,w,head[u]};head[u]=cnt;
E[++cnt]=(edge){u,0,head[v]};head[v]=cnt;
}
int dfs(int u,int fl) {
if(u==T) return fl;
int res=0;
for(int i=head[u];i;i=E[i].nxt){
int v=E[i].v,w=E[i].w;
if(!w||dis[v]!=dis[u]+1)continue;
int kk=dfs(v,min(w,fl));
E[i].w-=kk,E[i^1].w+=kk;
res+=kk;fl-=kk;
if(!fl) break;
}
return res;
}
queue<int>q;
bool bfs() {
for(int i=1;i<=ans*(n+1);i++) dis[i]=0;
while(q.size())q.pop();
q.push(S);dis[T]=0;
while(q.size()) {
int u=q.front();q.pop();
if(u==T)return 1;
for(int i=head[u];i;i=E[i].nxt){
int v=E[i].v,w=E[i].w;
if(!w||dis[v])continue;
dis[v]=dis[u]+1;
q.push(v);
}
}
return 0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
S=0,T=800003;
for(int i=1;i<=n+2;i++) fa[i]=i;
for(int i=1;i<=m;i++) {
cin>>h[i]>>r[i];
for(int j=0;j<r[i];j++) {
cin>>s[i][j];
if(s[i][j]==0) s[i][j]=n+1;
if(s[i][j]==-1) s[i][j]=n+2;
if(j){
int x=find(s[i][j-1]),y=find(s[i][j]);
if(x!=y) fa[x]=y;
}
}
}
if(find(n+1)!=find(n+2)) {
cout<<"0"<<endl;
return 0;
}
int ff=0;
while(++ans){
add(S,ans*(n+1),inf);
for(int i=1;i<=m;i++) {
int u=(ans-1)%r[i],v=ans%r[i];
if(s[i][u]==n+2) u=T;
else u=(ans-1)*(n+1)+s[i][u];
if(s[i][v]==n+2) v=T;
else v=ans*(n+1)+s[i][v];
add(u,v,h[i]);
}
while(bfs()) ff+=dfs(S,inf);
if(ff>=k){
cout<<ans<<endl;
return 0;
}
for(int i=1;i<=n+1;i++) add((ans-1)*(n+1)+i,ans*(n+1)+i,inf);
}
return 0;
}