刚才做abcG的时候单位容量网络增光了n次,这显然是不对的(应该增广sqrtn次),但是我也不知道我板子写错了什么
struct edge{
int to,nxt,flow;
}e[200010];
int cnt=1,head[200010],now[200010],dep[200010],n,m,s,t;
void add(int u,int v,int w){
// cout<<u<<' '<<v<<' '<<w<<endl;
e[++cnt]={v,head[u],w};
head[u]=cnt;
e[++cnt]={u,head[v],0};
head[v]=cnt;
}
int bfs(){
for(int i=0;i<=t;++i)dep[i]=0,now[i]=head[i];dep[s]=1;
queue<int>q;q.push(s);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;if(e[i].flow>0&&dep[v]==0){
dep[v]=dep[u]+1,q.push(v);
if(v==t)return 1;
}
}
}return 0;
}
int dfs(int u,int f){
if(u==t||!f)return f;
int sum=0;
for(int &i=now[u];i;i=e[i].nxt){
int v=e[i].to;
if(e[i].flow)
if(dep[v]==dep[u]+1){
int k=dfs(v,min(f,e[i].flow));
if(!k){dep[v]=0;continue;}
e[i].flow-=k,e[i^1].flow+=k;
sum+=k,f-=k;
}
}return sum;
}
bool check(int k){
memset(e,0,sizeof(e));
for(int i=1;i<=t;++i)head[i]=now[i]=dep[i]=0;
cnt=1;
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(F[i][j]<=k){
add(i,j+n,1);
}
for(int i=1;i<=n;++i)add(s,i,1);
for(int i=1;i<=n;++i)add(i+n,t,1);
int ans=0;while(bfs())ans+=dfs(s,INT_MAX);
// cout<<k<<' '<<ans<<endl;
return ans==n;
}