标签:int flow 网络 板子 vis num inf dis
自己懒得写网络流用的,你也可以拿去用:
普通最大流:
struct FLOW{
int flow[N],nex[N],first[N],v[N],dep[N],q[N],no[N],num=1,aim,fromt[N];
void add(int from,int to,int val){nex[++num]=first[from];fromt[num]=from;first[from]=num;v[num]=to;flow[num]=val;}
bool bfs(int s,int t){
for(int i=s;i<=t;i++) dep[i]=0,q[i]=0;
q[1]=s;dep[s]=1;no[s]=first[s];
int head=0,tail=1;
while(head!=tail){
int u=q[++head];
for(int i=first[u];i;i=nex[i]){int to=v[i];if(flow[i] && !dep[to]){no[to]=first[to];dep[to] = dep[u] + 1;q[++tail] = to;}}
}
return dep[t]!=0;
}
int dfs(int now,int fl){
if(now==aim) return fl;
int f=0;
for(int i=no[now];i&&fl;i=nex[i]){
no[now]=i;int to=v[i];
if(flow[i] && dep[to] == dep[now]+1){int x=dfs(to,min(fl,flow[i]));flow[i]-=x;flow[i^1]+=x;fl-=x;f+=x; }
}
if(!f) dep[now]=-2;return f;
}
int mxflow(int s,int t){
aim=t;int ret=0;
while(bfs(s,t)) ret+=dfs(s,1<<30);
return ret;
}
}G;
最大费用最大流:
struct FLOW{
int num=1,nex[N],first[N],v[N],flow[N],cost[N],dis[N],inf[N],last[N],vis[N],q[N];
int pre[N],mincost,fromt[N],vib[N];
void add(int from,int to,int val,int c){nex[++num]=first[from];fromt[num]=from;first[from]=num;v[num]=to;flow[num]=val;cost[num]=c;}
bool spfa(int s,int t){
memset(dis,0xcf,sizeof(dis));memset(vis,0,sizeof(vis));memset(inf,0x7f,sizeof(inf));
q[1]=s;vis[s]=1;dis[s]=0;pre[t]=-1;int l=0,r=1;
while(l!=r){int u=q[++l];vis[u]=0;for(int i=first[u];i;i=nex[i]){int to=v[i];if(flow[i] && dis[to]<dis[u]+cost[i]){dis[to]=dis[u]+cost[i];pre[to]=u;last[to]=i;inf[to]=min(inf[u],flow[i]);if(!vis[to]){vis[to]=1;q[++r]=to;}}}}
return pre[t]!=-1;
}
void EK(int s,int t){
while(spfa(s,t)){
int now=t;mincost+=inf[t]*dis[t];
while(now!=s){flow[last[now]]-=inf[t];flow[last[now]^1]+=inf[t];now=pre[now];}
}
}
}G,T;
最小费用最大流:
struct FLOW{
int num=1,nex[N],first[N],v[N],flow[N],cost[N],dis[N],inf[N],last[N],vis[N],q[N];
int pre[N],mincost,fromt[N],vib[N];
void add(int from,int to,int val,int c){nex[++num]=first[from];fromt[num]=from;first[from]=num;v[num]=to;flow[num]=val;cost[num]=c;}
bool spfa(int s,int t){
memset(dis,0x7f,sizeof(dis));memset(vis,0,sizeof(vis));memset(inf,0x7f,sizeof(inf));
q[1]=s;vis[s]=1;dis[s]=0;pre[t]=-1;int l=0,r=1;
while(l!=r){int u=q[++l];vis[u]=0;for(int i=first[u];i;i=nex[i]){int to=v[i];if(flow[i] && dis[to]>dis[u]+cost[i]){dis[to]=dis[u]+cost[i];pre[to]=u;last[to]=i;inf[to]=min(inf[u],flow[i]);if(!vis[to]){vis[to]=1;q[++r]=to;}}}}
return pre[t]!=-1;
}
void EK(int s,int t){
while(spfa(s,t)){
int now=t;mincost+=inf[t]*dis[t];
while(now!=s){flow[last[now]]-=inf[t];flow[last[now]^1]+=inf[t];now=pre[now];}
}
}
}G,T;
标签:int,flow,网络,板子,vis,num,inf,dis 来源: https://www.cnblogs.com/High-Pluto/p/14487785.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。