Pagini recente » Cod sursa (job #429212) | Cod sursa (job #1111322) | Cod sursa (job #548506) | Cod sursa (job #3166659) | Cod sursa (job #1969688)
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int NMAX = 1000;
const int MMAX = 5000;
const int INF = 2000000000;
int n, m;
int flux[1 + NMAX][1 + NMAX];
vector<int> adj[1 + NMAX];
queue<int> q;
int tata[1 + NMAX];
bool pump()
{
memset(tata, 0, sizeof(tata));
while(!q.empty())
q.pop();
tata[1] = 1;
q.push(1);
while(!q.empty())
{
int nod = q.front();
q.pop();
for(int i = 0; i < adj[nod].size(); i++)
{
int fiu = adj[nod][i];
if(flux[nod][fiu] > 0 && tata[fiu] == 0)
{
tata[fiu] = nod;
if(fiu == n)
return true;
else
q.push(fiu);
}
}
}
return false;
}
int solve()
{
int answer= 0;
while(pump())
{
int minim = INF;
for (int curr = n; tata[curr] != curr; curr = tata[curr])
minim = min(minim, flux[tata[curr]][curr]);
for (int curr = n; tata[curr] != curr; curr = tata[curr])
{
flux[tata[curr]][curr] -= minim;
flux[curr][tata[curr]] += minim;
}
answer += minim;
}
return answer;
}
int main()
{
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++)
{
int x, y;
scanf("%d %d", &x, &y);
scanf("%d", &flux[x][y]);
adj[x].push_back(y);
adj[y].push_back(x);
}
printf("%d\n", solve());
return 0;
}