昨天花费以上午学了简单最大流,对于最大流有了一定的了解,而这两道题,正好练练手,代码都是一样的,下面仅仅附上1532这道题
问题:
从s点能流入到t点的最大值。
解决办法:
EK算法:
每次找出一条到达t点的路然后更新该条路上的正向流量,和反向流量,如果找不到了路,说明当前一是最大流。下面附上代码。
#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
int cap[205][205],flow[205][205],n,m;
int Max_flow()
{
int a[207];
queue<int> q;
memset(flow,0,sizeof(flow));
int s = 1,t = m,f = 0,p[1001];
while(1)
{
memset(a,0,sizeof(a));
q.push(s);
a[s] = 9999999;
while(!q.empty())
{
int u = q.front();q.pop();
for(int v =1;v<=m;v++)
{
if(!a[v]&&cap[u][v]>flow[u][v])
{
a[v] =min(a[u],cap[u][v]-flow[u][v]);//找到一条路,并找到这条路上的最小流量
q.push(v);
p[v] = u;
}
}
}
if(a[t]==0)break;
for(int u = t;u!=s;u = p[u])// 更新流量
{
flow[p[u]][u] += a[t];
flow[u][p[u]] -= a[t];
}
f+=a[t];
}
return f;
}
int main()
{
int u,v,w;
while(~scanf("%d%d",&n,&m))
{
memset(cap,0,sizeof(cap));
while(n--)
{
scanf("%d%d%d",&u,&v,&w);
cap[u][v] += w;
}
cout<<Max_flow()<<endl;
}
}