题目
大致意思就是:有m个池塘,n条水渠,给出这n条水渠连接的池塘以及所能流过的最大水量,问水渠中所能流过的最大容量是多少。
网络流模板题。
网络流相关知识:https://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html
代码
#include<iostream>
#include<cstdio>
#include<string.h>
#include<queue>
using namespace std;
#define inf 0x3f3f3f
typedef long long ll;
const int N=210;
int n,m,pre[N],mp[N][N];
bool vis[N];
void updata(int u,int flow)
{
while(pre[u]!=-1)
{
mp[pre[u]][u]-=flow;
mp[u][pre[u]]+=flow;
u=pre[u];
}
}
int find_path(int s,int t)
{
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
vis[s]=1;
int mini=inf;
queue<int> q;
q.push(s);
while(!q.empty())
{
int cur=q.front();
q.pop();
if(cur==t) break;
for(int i=1;i<=m;i++)
{
if(!vis[i]&&mp[cur][i]!=0)
{
q.push(i);
mini=min(mini,mp[cur][i]);
pre[i]=cur;
vis[i]=1;
}
}
}
if(pre[t]==-1) return 0;
return mini;
}
int karp(int s,int t)
{
int flow=0;
int sum=0;
do
{
flow=find_path(s,t);
updata(t,flow);
sum+=flow;
}while(flow!=0);
return sum;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(mp,0,sizeof(mp));
for(int i=0;i<n;i++)
{
int a,b,val;
scanf("%d%d%d",&a,&b,&val);
mp[a][b]+=val;//注意可能有重复的水渠
}
int ans=karp(1,m);
printf("%d\n",ans);
}
return 0;
}