Pagini recente » Cod sursa (job #1329669) | Cod sursa (job #1595595) | Cod sursa (job #1639839) | Cod sursa (job #1775308) | Cod sursa (job #1738950)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#include <climits>
using namespace std;
int BFS (unsigned short int start, unsigned short int finish);
void EdmondsKarp (unsigned short int start, unsigned short int finish);
unsigned short int N, M;
unsigned short int x, y, z;
unsigned int cap[1001][1001]; ///capacity
vector <unsigned int> G[1001];
queue <unsigned int> Q;
int flow[1001][1001];
int parent[1001];
bool seen[1001];
unsigned int i;
unsigned int F;
int main ()
{
ifstream fin ("maxflow.in");
fin >> N >> M;
for (i=1; i<=M; i++)
{
fin >> x >> y >> z;
G[x].push_back(y);
G[y].push_back(x);
cap[x][y] = z;
}
fin.close();
EdmondsKarp(1,N);
ofstream fout ("maxflow.out");
fout << F;
fout.close();
return 0;
}
int BFS (unsigned short int start, unsigned short int finish)
{
unsigned short int node;
unsigned int i;
memset(seen,0,sizeof(seen));
Q.push(start);
seen[start] = 1;
while (!Q.empty())
{
node = Q.front();
Q.pop();
for (i=0; i<G[node].size(); i++)
if (!seen[G[node][i]] && cap[node][G[node][i]] > flow[node][G[node][i]])
{
seen[G[node][i]] = 1;
parent[G[node][i]] = node;
if (finish != G[node][i])
Q.push(G[node][i]);
}
}
return seen[finish];
}
void EdmondsKarp (unsigned short int start, unsigned short int finish)
{
unsigned short int node;
int Flow;
unsigned int i;
while (BFS(start,finish))
{
for (i=0; i<G[finish].size(); i++)
{
if (seen[G[finish][i]] && cap[G[finish][i]][finish] > flow[G[finish][i]][finish])
{
parent[finish] = G[finish][i];
Flow = INT_MAX;
for (node=finish; node!=start; node=parent[node])
if ((cap[parent[node]][node]-flow[parent[node]][node]) < Flow)
Flow = cap[parent[node]][node] - flow[parent[node]][node];
for (node=finish; node!=start; node=parent[node])
{
flow[parent[node]][node] += Flow;
flow[node][parent[node]] -= Flow;
}
F += Flow;
}
}
}
}