Pagini recente » Profil awrcsknnaet | Cod sursa (job #493640) | Profil Porc_dumitru | Paginatie | Cod sursa (job #403886)
Cod sursa(job #403886)
// Catalin Balan
// Thu Feb 25 14:41:41 EET 2010
// Infoarena - Flux Maxim
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <cstring>
using namespace std;
#define NMAX 1004
#define CHUNK 8192
#define INF 0x3f3f3f3f
#define min(a,b) (a<b?a:b)
#define FIN "maxflow.in"
#define FOUT "maxflow.out"
char g_buf[CHUNK];
int g_p=CHUNK-1;
inline int get(FILE *f)
{
int x = 0;
while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;
while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
{
x = x*10 + g_buf[g_p]-'0';
if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;
}
return x;
}
int Cap[NMAX][NMAX];
int Flux[NMAX][NMAX];
int Q[NMAX];
vector<int> G[NMAX];
int n;
int viz[NMAX];
int parent[NMAX];
int BF()
{
Q[1] = 1;
int len = 1, now, next;
memset(viz,0,sizeof(viz));
for (int i = 1; i <= len; ++i)
{
now = Q[i];
if (now == n) continue;
for (vector<int>::iterator it = G[now].begin(); it != G[now].end(); ++it)
{
next = *it;
if (viz[next] || ( Cap[now][next] == Flux[now][next] )) continue;
viz[next] = 1;
Q[++len] = next;
parent[next] = now;
}
}
return viz[n];
}
int main(int argv, char ** argc)
{
FILE *fin = fopen(FIN, "r");
FILE *fout = fopen(FOUT, "w");
n = get(fin);
int m = get(fin);
int x,y;
for (;m;--m)
{
x = get(fin);
y = get(fin);
Cap[x][y] = get(fin);
G[x].push_back(y);
G[y].push_back(x);
}
int flow, minflow;
for (flow = 0; BF();)
{
for (vector<int>::iterator it = G[n].begin(); it != G[n].end(); ++it)
{
if (!viz[*it]) continue;
parent[n] = *it;
minflow = INF;
for (int i = n; i != 1; i = parent[i])
minflow = min(minflow, Cap[ parent[i] ][ i ] - Flux[ parent[i] ][ i ]);
for (int i = n; i != 1; i = parent[i])
Flux[ parent[i] ][ i ] += minflow, Flux[ i ][ parent[i] ] -= minflow;
flow += minflow;
}
}
fprintf(fout,"%d\n",flow);
fclose(fin);
fclose(fout);
return EXIT_SUCCESS;
}