Pagini recente » Cod sursa (job #1434228) | Cod sursa (job #1752808) | Cod sursa (job #1119493) | Cod sursa (job #965553) | Cod sursa (job #2202095)
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
const int N = 1005;
using namespace std;
vector<int> g[N];
int flux[N][N], capacitate[N][N];
int n,m,i,j;
int tata[N];
int bf(int s)
{
int i;
for(i=1;i<=n;i++)
tata[i] = 0;
queue<int> q;
q.push(s);
while(!q.empty())
{
int x = q.front();
q.pop();
int a,b;
for(int y : g[x])
{
a = x;
b = y;
if(b < 0)
{
b = -b;
swap(a,b);
}
if(!tata[b] && capacitate[a][b] > flux[a][b])
{
q.push(b);
if(y > 0)
tata[b] = a;
else
tata[b] = -a;
if(b == n)
return 1;
}
}
}
return 0;
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin>>n>>m;
for(i=0;i<m;i++)
{
int a,b,c;
fin>>a>>b>>c;
g[a].push_back(b);
g[b].push_back(-a);
capacitate[a][b] = c;
}
long long fluxTotal = 0;
while(bf(1))
{
int mf = 1<<30;
int t = n;
int cap, fl;
while(tata[t])
{
if(tata[t] < 0)
{
tata[t] = -tata[t];
if(capacitate[t][tata[t]] - flux[t][tata[t]] < mf)
mf = capacitate[t][tata[t]] - flux[t][tata[t]];
}
else
{
if(capacitate[tata[t]][t] - flux[tata[t]][t] < mf)
mf = capacitate[tata[t]][t] - flux[tata[t]][t];
}
t = tata[t];
}
fluxTotal += mf;
t = n;
while(tata[t])
{
if(tata[t] > 0)
flux[tata[t]][t] += mf;
else
{
tata[t] = -tata[t];
flux[t][tata[t]] -= mf;
}
t = tata[t];
}
}
fout<<fluxTotal;
return 0;
}