洛谷3376程序:Dinic算法实现网络流优化,代码长度1.4kB,耗时818ms

2024-11-30
来源:网络整理

洛谷3376程序代码长度为1.4kB,需要时间。这里是后续网络流程中一个非常重要的算法。它的方法是先通过bfs找到bfs的顺序。在寻找增广路径(可以相加的路径)时,首先判断这条边的终点的bfs阶数是否等于起点的bfs阶数+1,如果是,则对其进行增广。否则,寻找另一个边缘。

网络流_流网络空间经济学_流网络图

#

#

#

#

#

#

#

标准;

int n,m,s,t,u,v,w,e,dist[],x;

q;

啊啊{

int 到,w,下一个;

}edge[];//必须使用边表来构建边,否则会超时

int head[],流,;

布尔添加(int u,int to,int w)

边缘[e].next=head[u];

边[e].to=to;

边[e].w=w;

头[u]=e++;

}//边表创建操作大家应该都很熟悉了,这里不再赘述。

布尔 bfs()

(dist,0,(dist));//初始化

流网络空间经济学_网络流_流网络图

距离[s]=1;

q.push(s);

(q.()==0)

int k=q.();q.pop();

for(int i=head[k];~i;i=edge[i].next)

if(edge[i].w && !dist[edge[i].to])dist[edge[i].to]=dist[k]+1,q.push(edge[i].to);

dist[t];//如果s和t不相连,则返回0

}//求每个点的bfs阶

int dfs(int u,int 流)

if(u==t) flow;//如果当前点=终点,则终止循环

if(dist[u]>=dist[t]) 0;如果当前的bfs阶数大于t的dfs阶数,那么这不是合法的网络流,此时为0

for(int i=head[u];~i;i=edge[i].next)

if(edge[i].w && dist[edge[i].to]==dist[u]+1 && (x=dfs(edge[i].to,min(edge[i].w,flow)) )))//如果这条边的权重>0 &&终点的bfs阶大于起点的bfs阶&&这条边的终点可以到达t,则执行

边[i].w-=x;

edge[i^1].w+=x;//这一步很重要。就是所谓的加一个后向边来防止这种策略错误。如果出现错误,还可以按原路返回。

x;

0;

int main()

("%d%d%d%d",&n,&m,&s,&t);//输入

(head,-1,(head));//初始化,这一步很重要。我原本因为没有添加这一步而错过了三点。

for(int i=1;i

分享