Pagini recente » Cod sursa (job #1558253) | Cod sursa (job #1395528) | Cod sursa (job #386456) | Cod sursa (job #32019) | Cod sursa (job #2818404)
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
const int NMAX = 1000, MMAX = 5000, INF = 1e8;
int myq[NMAX];
int flow[NMAX + 1][NMAX + 1], cap[NMAX + 1][NMAX + 1], father[NMAX + 1];
bool vis[NMAX + 1];
vector<int> edges[NMAX + 1];
bool bfs(int n);
int main()
{
int i, n, v1, v2, c, m, len, node, maxflow, minflow;
FILE *fin = fopen("maxflow.in", "r");
fscanf(fin, "%d%d", &n, &m);
for (i = 0; i < m; i++)
{
fscanf(fin, "%d%d%d", &v1, &v2, &c);
cap[v1][v2] = c;
edges[v1].push_back(v2);
edges[v2].push_back(v1);
}
fclose(fin);
maxflow = 0;
while (bfs(n))
{
len = edges[n].size();
for (i = 0; i < len; i++)
{
node = edges[n][i];
if (!vis[node] || flow[node][n] == cap[node][n])
continue;
father[n] = node;
minflow = INF;
while (node != 1)
{
minflow = min(minflow, cap[father[node]][node] - flow[father[node]][node]);
node = father[node];
}
if (minflow)
{
node = n;
while (node != 1)
{
flow[father[node]][node] += minflow;
flow[node][father[node]] -= minflow;
node = father[node];
}
maxflow += minflow;
}
}
}
FILE *fout = fopen("maxflow.out", "w");
fprintf(fout, "%d", maxflow);
fclose(fout);
return 0;
}
bool bfs(int n)
{
int left, right, i, son, node, len;
for (i = 1; i <= n; i++)
vis[i] = 0;
left = 0, right = 1, myq[0] = 1, vis[1] = 1;
while (left < right)
{
node = myq[left++];
len = edges[node].size();
if (node == n)
continue;
for (i = 0; i < len; i++)
{
son = edges[node][i];
if (!vis[son] && cap[node][son] - flow[node][son] != 0)
{
vis[son] = 1;
father[son] = node;
myq[right++] = son;
}
}
}
return vis[n];
}