Pagini recente » Cod sursa (job #698484) | Cod sursa (job #2103484) | Cod sursa (job #445827) | Cod sursa (job #1761024) | Cod sursa (job #1680377)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int Nmax = 1005;
int n, m, F[Nmax][Nmax], C[Nmax][Nmax], T[Nmax], fluxmin, Use[Nmax];
vector <int> G[Nmax];
queue <int> Q;
int BFS()
{
memset(Use, 0, sizeof(Use));
while(!Q.empty()) Q.pop();
Use[1] = 1;
Q.push(1);
while(!Q.empty())
{
int nod = Q.front();
Q.pop();
for(int i = 0; i < (int)G[nod].size(); i++)
{
int vecin = G[nod][i];
if(Use[vecin] == 1 || F[nod][vecin] == C[nod][vecin]) continue;
T[vecin] = nod;
Q.push(vecin);
Use[vecin] = 1;
if(vecin == n) return 1;
}
}
return 0;
}
int main()
{
f>>n>>m;
while(m--)
{
int x,y,c;
f>>x>>y>>c;
G[x].push_back(y);
G[y].push_back(x);
C[x][y] = c;
}
int flux;
for(flux = 0; BFS(); flux += fluxmin)
{
fluxmin = 100000000;
for(int i = n; i > 1; i = T[i])
{
fluxmin = min(fluxmin, C[T[i]][i] - F[T[i]][i]);
}
for(int i = n; i > 1; i = T[i])
{
F[T[i]][i] += fluxmin;
F[i][T[i]] -= fluxmin;
}
}
g<<flux<<'\n';
return 0;
}