Pagini recente » Cod sursa (job #1609747) | Cod sursa (job #270920) | Cod sursa (job #1261785) | Cod sursa (job #2011597) | Cod sursa (job #1871456)
#include <cstdio>
#include <cstring>
#define sqrInf 999999999
using namespace std;
FILE *fi, *g;
int n, m;
int rez;
///Graf
int c[1001][1001];
int f[1001][1001];
int k;
int lst[1001];
int urm[10001];
int nod[10001];
bool viz[1001];
int que[1001];
int tata[1001];
void add(int a, int b)
{
k ++;
nod[k] = b;
urm[k] = lst[a];
lst[a] = k;
}
void readFile()
{
fi = fopen("maxflow.in", "r");
fscanf(fi, "%d%d", &n, &m);
int i;
int a, b;
int cs;
for(i = 1; i <= m; i ++)
{
fscanf(fi, "%d%d%d", &a, &b, &cs);
c[a][b] += cs;
add(a, b);
add(b, a);
}
fclose(fi);
}
int BFS()
{
memset(viz, 0, sizeof(viz));
viz[1] = 1;
int st = 1, dr = 0;
int cr, p;
que[++ dr] = 1;
while(st <= dr)
{
cr = que[st ++];
for(p = lst[cr]; p != 0; p = urm[p])
{
if(viz[nod[p]] == 0 && f[cr][nod[p]] < c[cr][nod[p]])
{
viz[nod[p]] = 1;
que[++ dr] = nod[p];
tata[nod[p]] = cr;
}
}
}
return viz[n];
}
inline int mna(int a, int b)
{
return (a < b ? a : b);
}
void solve()
{
int i, j;
int p;
int nodul;
int mn;
while(BFS() != 0)
{
for(p = lst[n]; p != 0; p = urm[p])
{
nodul = nod[p];
if(f[nodul][n] < c[nodul][n] && viz[nodul] == 1)
{
tata[n] = nodul;
mn = sqrInf;
// printf("%d\n", mn);
for(nodul = n; nodul != 1; nodul = tata[nodul])
{
mn = mna(mn, c[tata[nodul]][nodul] - f[tata[nodul]][nodul]);
//if(c[tata[nodul]][nodul] - f[tata[nodul]][nodul] == 0)
// printf("++%d %d\n", nodul, tata[nodul]);
}
// if(mn != 0)
// printf("%d\n", mn);
if(mn > 0)
{
for(nodul = n; nodul != 1; nodul = tata[nodul])
{
f[tata[nodul]][nodul] += mn;
f[nodul][tata[nodul]] -= mn;
}
}
rez += mn;
}
}
}
}
void printFile()
{
g = fopen("maxflow.out", "w");
fprintf(g, "%d\n", rez);
fclose(g);
}
int main()
{
readFile();
solve();
printFile();
return 0;
}