#include <iostream>
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "algorithm"
#include <queue>
#include <stack>
#include <math.h>
#define INF 1<<30;
#define N 205
using namespace std;
int capacity[N][N]; //两点之间的边的容量
int flow[N]; //通过各个点的最大流量
int pre[N]; //记录某条路径上每个点之前的那个点
int n, m;
queue<int> que;
int BFS(int src, int des)
{
while(!que.empty())
que.pop();
for(int i = 1; i <= m; i++)
pre[i] = -1;
flow[src] = INF;
que.push(src);
while(!que.empty())
{
int index = que.front();
que.pop();
if(index == des) break;
for(int i = 1; i <= m; i++)
{
if(i != src && capacity[index][i] > 0 && pre[i] == -1)
{
pre[i] = index;
flow[i] = min(flow[index], capacity[index][i]);
que.push(i);
}
}
}
if(pre[des] == -1) return -1;
return flow[des];
}
int maxflow(int src, int des)
{
int ans, maxn = 0;
int Front, now;
while((ans = BFS(src, des)) != -1)
{
Front = pre[des]; now = des;
while(Front != -1)
{
capacity[Front][now] -= ans;
capacity[now][Front] += ans;
now = Front;
Front = pre[Front];
}
maxn += ans;
}
return maxn;
}
int main()
{
int s, t, c;
//freopen("t", "r", stdin);
while(scanf("%d%d", &n, &m) != EOF)
{
memset(capacity, 0, sizeof capacity);
for(int i = 0; i < n; i++)
{
scanf("%d%d%d", &s, &t, &c);
if(s == t) continue; //同一点到自身有路径无意义
capacity[s][t] += c; //防止重边
}
printf("%d\n", maxflow(1, m));
}
return 0;
}
HDU 1532(最大流模板题)
最新推荐文章于 2020-11-09 20:37:29 发布