Pagini recente » Cod sursa (job #2602766) | Cod sursa (job #1436516) | Cod sursa (job #1787202) | Cod sursa (job #106265) | Cod sursa (job #2608672)
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <fstream>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int mp[1005][1005], parent[10000];
bool viz[100000], notSource[10000], notSink[10000];
int n, m;
bool bfs(int source, int sink)
{
for (int i = 1; i <= n; i++)viz[i] = 0, parent[i] = 0;
bool reached = 0;
queue<int>q;
q.push(source);
viz[source] = 1;
parent[source] = source;
while (!q.empty())
{
int crt = q.front();
q.pop();
viz[crt] = 1;
for (int i = 1; i <= n; i++)
{
if (viz[i])continue;
if (mp[crt][i] > 0)
{
q.push(i);
parent[i] = crt;
viz[i] = 1;
if (i == sink)
{
reached = 1;
}
}
if (reached)
break;
}
if (reached)
break;
}
return reached;
}
int edmondsKarp(int source, int sink)
{
int rez = 0;
while (bfs(source, sink))
{
int a=parent[sink], b=sink;
int Min = 10000000;
Min = min(Min,mp[a][b]);
while (a != parent[a])
{
b = a;
a = parent[a];
Min = min(Min, mp[a][b]);
}
a = parent[sink], b = sink;
mp[a][b] -= Min;
mp[b][a] += Min;
while (a != parent[a])
{
b = a;
a = parent[a];
mp[a][b] -= Min;
mp[b][a] += Min;
}
rez += Min;
}
return rez;
}
int main()
{
int source, sink;
fin >> n >> m;
for (int i = 0; i < m; i++)
{
int a, b, w;
fin >> a >> b >> w;
mp[a][b] = w;
notSink[a] = 1;
notSource[b] = 1;
}
for (int i = 1; i <= n; i++) {
if (!notSink[i])
sink = i;
if (!notSource[i])
source = i;
}
fout<<edmondsKarp(source, sink);
}