Pagini recente » Cod sursa (job #52911) | Cod sursa (job #1508297) | Cod sursa (job #3273388) | Cod sursa (job #1965663) | Cod sursa (job #1891822)
#include <fstream>
#include<climits>
using namespace std;
ifstream cin ("maxflow.in");
ofstream cout ("maxflow.out");
int n, k, m, start[5010], tata[1010], coada[1010], cost[1010][1010], viz[1010], nr , flux,vecini[1010],p;
struct bla
{
int nod, urm;
} t[1010];
void read ()
{
int a, b, c;
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
cin >> a >> b >> c; if(b==n) vecini[++p]=a;
t[++k].nod = b;
t[k].urm = start[a];
start[a] = k;
cost[a][b] = c;
}
}
bool bfs ()
{
int ps = 1, pi = 1;
coada[1] = 1;
tata[1] = -1;
viz[1] = nr;
while(ps <= pi)
{
int x = start[coada[ps]];
while(x)
{
if(viz[t[x].nod] < nr && cost[coada[ps]][t[x].nod] > 0)
{
coada[++pi] = t[x].nod, tata[t[x].nod] = coada[ps], viz[t[x].nod] = nr;
if(t[x].nod == n) return true;
}
x = t[x].urm;
} ++ps;
}
return false;
}
void solve_here ()
{
nr = 1;
while(bfs())
{
for(int i=1;i<=p;i++)
{
int x=vecini[i],minim=INT_MAX;
if(viz[x]==nr)
{
while(tata[x]!=-1)
{
if(cost[tata[x]][x]<minim) minim=cost[tata[x]][x]; x=tata[x];
}
x=vecini[i];
while(tata[x]!=-1)
{
cost[tata[x]][x]-=minim; x=tata[x];
}
flux+=minim;
}
} ++nr;
}
}
void write ()
{
cout << flux;
}
int main()
{
read();
solve_here();
write();
cin.close();
cout.close();
return 0;
}