网络流是干嘛的?举一个例子:在一个水上城市中,有很多小镇,之间有很多座桥连着,每一座桥因为制作材料不同最大载重不同,如果超过最大载重,桥就垮了,桥上的人就GG了,所以
网络流是干嘛的?举一个例子:
在一个水上城市中,有很多小镇,之间有很多座桥连着,每一座桥因为制作材料不同最大载重不同,如果超过最大载重,桥就垮了,桥上的人就GG了,所以我们不能让这样的情况发生——即:每一条边的流量不能超过容量,我们再规定一个起点,一个终点,我们要从起点运货到终点,只有一次机会但可以同时走多条道路充分利用资源,最后求:最大运货量可以为多少?
这就是网络最大流问题,求某点到某点的最大流量。
EK算法,网络流最朴素的算法,不断寻找增广路,再来回两遍减容量,加ans,容易理解:
1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 const int MAXN=200+10,inf=2000000000; 8 int c[MAXN][MAXN],f[MAXN][MAXN],q[MAXN][2],n,m,ans;//c数组是记录容量,f数组是记录流量,q为队列,因为既要记录当前点,也要记录路径,所以开2维 9 bool p[MAXN],mark=true;//p代表每个点是否可取(每个点只能取一次)10 inline void read(int 13 char c=getchar();14 while(c‘9‘)c=getchar();15 while(c>=‘0‘18 c=getchar();19 }20 }21 int main()22 {23 read(m);read(n);24 for(register int i=1;i<=m;++i)//输入容量,没有连通的容量就为025 {26 int x,y,z;27 read(x);read(y);read(z);28 c[x][y]+=z;//有可能两个点之间有多条管道29 }30 while(mark)31 {32 mark=false;33 for(register int i=1;i<=n;++i)p[i]=true;//把每个点都设为可取34 p[1]=false;//把1取走35 q[1][0]=1;//放入队列36 q[1][1]=0;//1的前面路径为037 int head=0,tail=1;//队列的头和尾38 while(head【算法】网络最大流 EK