求助dnic板子
  • 板块学术版
  • 楼主迟暮天复明心華
  • 当前回复12
  • 已保存回复14
  • 发布时间2025/4/12 22:45
  • 上次更新2025/4/13 15:51:23
查看原帖
求助dnic板子
222865
迟暮天复明心華楼主2025/4/12 22:45

刚才做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;
}
2025/4/12 22:45
加载中...