网络流-最大流入门题。
CODE:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int M = 201;
const int INF = 0x3f3f3f3f;
int flow[M][M], cap[M][M];
int a[M], p[M];
int s, t;
int n, m;
void init()
{
memset(p, 0, sizeof(p));
memset(cap, 0, sizeof(cap));
}
int EK(int s, int t)
{
queue<int> q;
memset(flow, 0, sizeof(flow));
int f = 0;
for(;;)
{
memset(a, 0, sizeof(a)); //a[i]保存s到每个节点i路径上的最小参量,a[t]就是整条s-t道路上的最小残量。
a[s] = INF;
q.push(s);
while(!q.empty()) //BFS找增广路径
{
int u = q.front(); q.pop(); //记录v的父亲,并加入FIFO队列。
for(int v = 1; v <= n; v++) if(!a[v] && cap[u][v]>flow[u][v])
{
p[v] = u; q.push(v); //记录v的父亲,并加入FIFO队列
a[v] = min(a[u], cap[u][v]-flow[u][v]); //s-v路径上的最小残量
}
}
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()
{
while(~scanf("%d%d", &m, &n))
{
init();
while(m--)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
cap[u][v] += w;
}
int ans = EK(1, n);
printf("%d\n", ans);
}
return 0;
}
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int M = 201;
const int INF = 0x3f3f3f3f;
int flow[M][M], cap[M][M];
int a[M], p[M];
int s, t;
int n, m;
void init()
{
memset(p, 0, sizeof(p));
memset(cap, 0, sizeof(cap));
}
int EK(int s, int t)
{
queue<int> q;
memset(flow, 0, sizeof(flow));
int f = 0;
for(;;)
{
memset(a, 0, sizeof(a)); //a[i]保存s到每个节点i路径上的最小参量,a[t]就是整条s-t道路上的最小残量。
a[s] = INF;
q.push(s);
while(!q.empty()) //BFS找增广路径
{
int u = q.front(); q.pop(); //记录v的父亲,并加入FIFO队列。
for(int v = 1; v <= n; v++) if(!a[v] && cap[u][v]>flow[u][v])
{
p[v] = u; q.push(v); //记录v的父亲,并加入FIFO队列
a[v] = min(a[u], cap[u][v]-flow[u][v]); //s-v路径上的最小残量
}
}
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()
{
while(~scanf("%d%d", &m, &n))
{
init();
while(m--)
{
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
cap[u][v] += w;
}
int ans = EK(1, n);
printf("%d\n", ans);
}
return 0;
}