U562065 网路流相关代码

题目背景

# 最大流 ## Dinic ### 朴素Dinic ```cpp bool bfs(){ for(int i=1;i0&&dep[v]==0){ dep[v]=dep[x]+1; if(v==t){ return 1; } q.push(v); } } } return 0; } int dfs(int x,int flow){ if(x==t) return flow; int rest=flow; for(int i=head[x];i;i=e[i].nxt){ int v=e[i].to,w=e[i].w; if(w>0&&dep[v]==dep[x]+1){ int t=dfs(v,min(rest,w)); rest-=t; e[i].w-=t; e[i^1].w+=t; } } return flow-rest; } ``` ### 完全体 Dinic ```cpp bool bfs(){ for(int i=1;i0&&dep[v]==0){ dep[v]=dep[x]+1; if(v==t){ return 1; } q.push(v); } } } return 0; } int dfs(int x,int flow){ if(x==t) return flow; int rest=flow; for(int i=lead[x];i&&rest;i=e[i].nxt){ lead[x]=i; int v=e[i].to,w=e[i].w; if(w>0&&dep[v]==dep[x]+1){ int t=dfs(v,min(rest,w)); if(!t) dep[v]=0; rest-=t; e[i].w-=t; e[i^1].w+=t; } } return flow-rest; } ``` ## ISAP ```cpp void bfs(){ while(!q.empty()) q.pop(); q.push(t); dep[t]=1; gap[1]++; while(!q.empty()){ int x=q.front(); q.pop(); for(int i=head[x];i;i=e[i].nxt){ int v=e[i].to; if(!dep[v]){ dep[v]=dep[x]+1; q.push(v); gap[dep[v]]++; } } } } int dfs(int x,int flow){ if(x==t||flow==0) return flow; int rest=flow; for(int i=lead[x];i&&rest;i=e[i].nxt){ lead[x]=i; int v=e[i].to,w=e[i].w; if(dep[x]==dep[v]+1&&w>0){ int t=dfs(v,min(rest,w)); rest-=t; e[i].w-=t; e[i^1].w+=t; } } if(rest){ gap[dep[x]]--; if(!gap[dep[x]]){ dep[s]=t+1; } dep[x]++; gap[dep[x]]++; } return flow-rest; } int ISAP(){ int ans=0; memset(dep,0,sizeof(dep)); memset(gap,0,sizeof(gap)); bfs(); while(dep[s]

题目描述

# 费用流 ## Dinic求费用流 没打过拷了个 tj。 ```cpp bool spfa()//spfa求最短路 { memset(Dis,0x3f,sizeof(Dis)); memset(Vis,0,sizeof(Vis)); memcpy(Cur,Head,sizeof(Cur)); Q.clear(); Q.push_back(s); Dis[s]=0; Vis[s]=1; while(!Q.empty()) { int x=Q.front(); Q.pop_front(); Vis[x]=0; for(int i=Head[x];i;i=Next[i]) { int y=Son[i]; if(Cap[i]&&Dis[y]>Dis[x]+Cost[i]) { Dis[y]=Dis[x]+Cost[i]; if(!Vis[y]) { Q.push_back(y); Vis[y]=1; } } } } return Dis[t]^infll; } ll dfs(int x,ll flow)//dfs增广 { if(x==t)return flow; Vis[x]=1; ll res=0; for(int i=Cur[x];i&&flow;i=Next[i]) { int y=Son[i]; Cur[x]=i; if(!Vis[y]&&Cap[i]&&Dis[y]==Dis[x]+Cost[i]) { ll k=dfs(y,min(flow,Cap[i])); if(!k)Dis[y]=infll; Cap[i]-=k; Cap[i^1]+=k; res+=k; flow-=k; mincost+=k*Cost[i];//直接在这里记录费用 } } Vis[x]=0; return res; } ``` ## EK 求费用流 ```cpp bool spfa(){ for(int i=1;i

输入格式

# 上下界网络流 ## 满配 省略了前面的原始对偶,给你个满配你还不磕俩响头(?) ```cpp void add(int u,int v,int l,int r,int c){ //注意这个是传5个参数的,参与流量计算 add(u,v,r-l,c); liu[u]-=l,liu[v]+=l; } //注意下边的所有都只有4个参,不参与流量计算 add(yt,ys,1e18,0); //如果无源汇则不需要这一行,这条边的编号会被 nb 记录。 for(int i=1;i0){ add(s,i,liu[i],0); all+=liu[i]; } else if(liu[i]

输出格式