Pagini recente » Cod sursa (job #2123867) | Cod sursa (job #1882462) | Cod sursa (job #3145188) | Cod sursa (job #1893682) | Cod sursa (job #2618702)
#include <stdio.h>
#include <queue>
#include <vector>
#include <limits.h>
#include <stdlib.h>
#define MAX 1000
typedef std::vector<int> Graph;
bool bfs(Graph graph[], int costs[][MAX], 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 it = 0; it < graph[nod].size(); it++)
{
int i = graph[nod][it];
if (costs[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));
Graph graph[MAX];
int costs[MAX][MAX];
for (int i = 0; i < m; i++)
{
int nod1, nod2, cost;
fscanf(in, "%d%d%d", &nod1, &nod2, &cost);
nod1--;
nod2--;
graph[nod1].push_back(nod2);
graph[nod2].push_back(nod1);
costs[nod1][nod2] = cost;
}
int max_flow = 0;
while (bfs(graph, costs, n, 0, n - 1, parent))
{
for (int it = 0; it < graph[n - 1].size(); it++)
{
int i = graph[n - 1][it];
//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 = costs[nod1][nod2] < mini ? costs[nod1][nod2] : mini;
nod = parent[nod];
}
nod = n - 1;
while (nod != 0)
{
int nod1 = parent[nod];
int nod2 = nod;
costs[nod1][nod2] -= mini;
costs[nod2][nod1] += mini;
nod = parent[nod];
}
max_flow += mini;
}
}
fprintf(out, "%d\n", max_flow);
free(parent);
fclose(in);
fclose(out);
return 0;
}