Pagini recente » Cod sursa (job #2191894) | Cod sursa (job #2258290) | Cod sursa (job #2936819)
#include<bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m, ii, tt, i, x, y, c, flow[1005][1005], capacity[1005][1005], rez, dad[1005], curr, final_rez;
struct edge
{
int dest, cap;
}aux, aux1;
vector <edge> v[1005];
bool seen[1005];
int BFS(int start)
{
memset(seen, false, sizeof(seen));
seen[start] = true;
stack <edge> Q;
aux.dest = start;
aux.cap = INT_MAX;
Q.push(aux);
while(!Q.empty())
{
aux = Q.top();
Q.pop();
for(int i = 0; i < v[aux.dest].size(); i ++)
{
//cout << "seen = " << seen[v[aux.dest][i].dest] << " capacity = " << capacity[aux.dest][v[aux.dest][i].dest] << " flow = " << flow[aux.dest][v[aux.dest][i].dest] << "\n";
if (!seen[v[aux.dest][i].dest] && flow[aux.dest][v[aux.dest][i].dest] < capacity[aux.dest][v[aux.dest][i].dest])
{
//cout << aux.dest << " " << v[aux.dest][i].dest << "\n";
dad[v[aux.dest][i].dest] = aux.dest;
seen[v[aux.dest][i].dest] = true;
aux1.dest = v[aux.dest][i].dest;
aux1.cap = min(capacity[aux.dest][v[aux.dest][i].dest] - flow[aux.dest][v[aux.dest][i].dest], aux.cap);
Q.push(aux1);
if (v[aux.dest][i].dest == n)
return min(capacity[aux.dest][v[aux.dest][i].dest] - flow[aux.dest][v[aux.dest][i].dest], aux.cap);
}
}
}
return 0;
}
void read()
{
f >> n >> m;
for(i = 1; i <= m; i ++)
{
f >> x >> y >> c;
aux.dest = y;
aux.cap = c;
v[x].push_back(aux);
aux.dest = x;
aux.cap = c;
v[y].push_back(aux);
capacity[x][y] = aux.cap;
}
}
void solve()
{
while(true)
{
//cout << capacity[3][2] << "\n";
rez = BFS(1);
if(rez == 0)
break;
curr = n;
while(curr != 1)
{
//cout << "Dad of " << curr << " is " << dad[curr] << "\n";
flow[dad[curr]][curr] += rez;
flow[curr][dad[curr]] -= rez;
curr = dad[curr];
}
final_rez += rez;
}
}
void write()
{
g << final_rez << "\n";
f.close();
g.close();
}
int main()
{
//cin >> tt;
tt = 1;
for(ii = 1; ii <= tt; ii ++)
{
read();
solve();
write();
}
return 0;
}