Pagini recente » Cod sursa (job #838706) | Cod sursa (job #910517) | Cod sursa (job #2443915) | Cod sursa (job #2914515) | Cod sursa (job #558723)
Cod sursa(job #558723)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const char iname[] = "maxflow.in";
const char oname[] = "maxflow.out";
const int nmax = 1100;
ifstream fin(iname);
ofstream fout(oname);
vector<int> Gr[nmax];
int C[nmax][nmax], F[nmax][nmax], fmin, flow;
int i, j, n, x, y, c, m;
int T[nmax];
int viz[nmax];
int BFS()
{
queue<int> Q;
int node;
Q.push(1);
viz[1] = 1;
while(!Q.empty())
{
node = Q.front();
Q.pop();
for(vector<int>::iterator it = Gr[node].begin(); it != Gr[node].end(); ++it)
{
if(viz[*it] == 0)
{
if(F[node][*it] < C[node][*it])
{
viz[*it] = 1;
T[*it] = node;
Q.push(*it);
}
else
continue;
}
if(viz[n] == 1)
return 1;
}
}
return 0;
}
int main()
{
fin >> n >> m;
for(i = 1; i <= m; i ++)
{
fin >> x >> y >> c;
Gr[x].push_back(y);
Gr[y].push_back(x);
C[x][y] = c;
}
while(BFS())
{
fmin = 21899889;
for(i = n; T[i] != 0; i = T[i])
fmin = min(fmin, C[T[i]][i] - F[T[i]][i]);
for(i = n; T[i] != 0; i = T[i])
{
F[T[i]][i] += fmin;
F[i][T[i]] -= fmin;
}
flow += fmin;
memset(T, 0, sizeof(T));
memset(viz, 0, sizeof(viz));
}
fout << flow << "\n";
return 0;
}