Pagini recente » Cod sursa (job #2346941) | Cod sursa (job #2355522) | Cod sursa (job #1806501) | Cod sursa (job #1895236) | Cod sursa (job #2618690)
#include <stdio.h>
#include <queue>
#include <vector>
#include <limits.h>
#include <stdlib.h>
#define MAX 1000
bool bfs(int **graph, int n, int source, int sink, int *parent)
{
std::queue<int> q;
int viz[MAX] = {0};
q.push(source);
viz[source] = 1;
while (!q.empty())
{
int nod = q.front();
q.pop();
for (int i = 0; i < n; i++)
{
if (graph[nod][i])
{
if (!viz[i])
{
if (i != n - 1)
{
viz[i] = 1;
q.push(i);
parent[i] = nod;
}
else
viz[sink] = 1;
}
}
}
}
return viz[sink];
}
int main()
{
FILE *in = fopen("maxflow.in", "r");
FILE *out = fopen("maxflow.out", "w");
int n, m;
fscanf(in, "%d%d", &n, &m);
int *parent = (int *)malloc(n * sizeof(int));
int **graph = (int **)malloc(n * sizeof(int *));
for (int i = 0; i < n; i++)
graph[i] = (int *)malloc(n * sizeof(int));
for (int i = 0; i < m; i++)
{
int nod1, nod2, cost;
fscanf(in, "%d%d%d", &nod1, &nod2, &cost);
nod1--;
nod2--;
graph[nod1][nod2] = cost;
}
int max_flow = 0;
while (bfs(graph, n, 0, n - 1, parent))
{
for (int i = 0; i < n; i++)
{
if (!graph[i][n - 1])
continue;
parent[n - 1] = i;
int nod = n - 1;
int mini = INT_MAX;
while (nod != 0)
{
int nod1 = parent[nod];
int nod2 = nod;
mini = graph[nod1][nod2] < mini ? graph[nod1][nod2] : mini;
nod = parent[nod];
}
nod = n - 1;
while (nod != 0)
{
int nod1 = parent[nod];
int nod2 = nod;
graph[nod1][nod2] -= mini;
graph[nod2][nod1] += mini;
nod = parent[nod];
}
max_flow += mini;
}
}
fprintf(out, "%d\n", max_flow);
free(parent);
for (int i = 0; i < n; i++)
free(graph[i]);
free(graph);
fclose(in);
fclose(out);
return 0;
}