洛谷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