甚至这一个小样例就给我卡死了,但是完全看不出来错误(这是acwing的数据
2 3 3
1 2 0 2
1 2 1 2
1 2 1 -1
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10,M=1e5+10,inf=1e14;
int n,m,s,t;
int h[M],e[M*2],ne[M*2],w[M*2],idx,l[210][210];
void add(int a,int b,int c){
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
e[idx]=a,ne[idx]=h[b],w[idx]=0,h[b]=idx++;
}
int p[N];
int find(int x){
return p[x]==x?p[x]:p[x]=find(p[x]);
}
void un(int a,int b){
int pa=find(a),pb=find(b);
if(pa!=pb) p[pa]=pb;
}
int cur[N],d[N];
bool bfs(int Ndcnt){
for(int i=1;i<=Ndcnt;i++) d[i]=inf;
queue<int> q;
q.push(s);
d[s]=0;
cur[s]=h[s];
while(!q.empty()){
int x=q.front();q.pop();
for(int i=h[x];~i;i=ne[i]){
int j=e[i];
if(w[i]>0&&d[j]==inf){
q.push(j);
cur[j]=h[j];
d[j]=d[x]+1;
if(j==t) return 1;
}
}
}
return 0;
}
int dinic(int x,int flow){
if(x==t) return flow;
int res=0,k;
for(int i=cur[x];~i&&flow;i=ne[i]){
cur[x]=i;
int j=e[i];
if(w[i]>0&&d[j]==d[x]+1){
k=dinic(j,min(flow,w[i]));
if(!k) d[j]=inf;
w[i]-=k;
w[i^1]+=k;
res+=k;
flow-=k;
}
}
return res;
}
int maxflow(int Ndcnt){
int flow=0;
while(bfs(Ndcnt)) flow+=dinic(s,inf);
return flow;
}
int T,H[N],flr;
struct edge{
int u,v,w;
}edges[M];
signed main(){
memset(h,-1,sizeof(h));
scanf("%lld%lld%lld",&n,&m,&T);t=n+1;
// m 为太空船个数,T 为人数
for(int i=1;i<=n+1;i++) p[i]=i;
for(int i=1;i<=m;i++){
scanf("%lld%lld",&H[i],&l[i][0]);
for(int j=1;j<=l[i][0];j++){
scanf("%lld",&l[i][j]);
if(l[i][j]==-1) l[i][j]=t;
if(j>1) un(l[i][j],l[i][j-1]);
}
}
if(find(s)!=find(t)){
printf("0");
return 0;
}
flr=n+2;// 一层节点数
for(int tim=1;;tim++){
for(int i=0;i<=n;i++) add(i+(tim-1)*flr,i+tim*flr,inf);
add(n+1+tim*flr,n+1+(tim-1)*flr,inf);// 月球是倒着建图的
for(int i=1;i<=m;i++){
int tmp=(tim-1)%l[i][0]+1;
add(l[i][tmp]+(tim-1)*flr,l[i][tim%l[i][0]+1]+tim*flr,H[i]);
}
if(maxflow((tim+1)*flr)>=T){
printf("%lld",tim);
return 0;
}
}
return 0;
}