欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 P3376 【模板】网络最大流

发布时间:2025/7/25 编程问答 87 豆豆
生活随笔 收集整理的这篇文章主要介绍了 洛谷 P3376 【模板】网络最大流 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

题目描述

如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。

输入输出格式

输入格式:

 

第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。

接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)

 

输出格式:

 

一行,包含一个正整数,即为该网络的最大流。

 

输入输出样例

输入样例#1:
4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40 输出样例#1:
50

说明

时空限制:1000ms,128M

数据规模:

对于30%的数据:N<=10,M<=25

对于70%的数据:N<=200,M<=1000

对于100%的数据:N<=10000,M<=100000

样例说明:

题目中存在3条路径:

4-->2-->3,该路线可通过20的流量

4-->3,可通过20的流量

4-->2-->1-->3,可通过10的流量(边4-->2之前已经耗费了20的流量)

故流量总计20+20+10=50。输出50。

 

首次接触这种写法 

真神奇 

屠龙宝刀点击就送

#include <cstring> #include <vector> #include <cstdio> #include <queue>using namespace std;struct node {int to,next,dis; }edge[100001*2]; int tot=1,Answer,dis[100001],head[100001*20],n,m,s,t,i,j; void add(int from,int to,int w) {tot++;edge[tot].next=head[from];edge[tot].to=to;edge[tot].dis=w;head[from]=tot; } bool bfs() {queue<int>q;memset(dis,-1,sizeof(dis));dis[s]=0;q.push(s);while(!q.empty() ){int Top=q.front() ;q.pop() ;for(i=head[Top];i;i=edge[i].next){if(dis[edge[i].to]==-1&&edge[i].dis>0){dis[edge[i].to]=dis[Top]+1;if(edge[i].to==t) return 1;else q.push(edge[i].to); }}}return 0; } int work(int now,int f) {if(now==t||f==0) return f;int rest=0;for(int i=head[now];i;i=edge[i].next){int v=edge[i].to;if(edge[i].dis>0&&dis[v]==dis[now]+1){int t=work(v,min(f,edge[i].dis));rest+=t;f-=t;edge[i].dis-=t;edge[i^1].dis+=t;if(f==0) return rest;}}return rest; } int main() {scanf("%d%d%d%d",&n,&m,&s,&t);int u,v,l;for(i=0;i<m;++i){scanf("%d%d%d",&u,&v,&l);add(u,v,l);add(v,u,0);}while(bfs()) Answer+=work(s,1e8);printf("%d",Answer);return 0; }

 

转载于:https://www.cnblogs.com/ruojisun/p/6504415.html

总结

以上是生活随笔为你收集整理的洛谷 P3376 【模板】网络最大流的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。