Pagini recente » Cod sursa (job #1768089) | Cod sursa (job #3166554) | Cod sursa (job #1868846) | Cod sursa (job #2791285) | Cod sursa (job #457879)
Cod sursa(job #457879)
#include <stdio.h>
#include <vector.h>
#define N 1000
//---------------------
int vis[N], par[N], bf[N], reach[N];
int cost[N][N], used[N][N];
vector<int> adj[N];
int n,m, flux, nreach;
//---------------------
void read()
{
FILE *f = fopen("maxflow.in","r");
fscanf(f,"%d %d",&n,&m);
for(int i=0; i<m; i++)
{
int a,b,c;
fscanf(f,"%d %d %d",&a,&b,&c);
cost[--a][--b] = c;
cost[b][a] = c;
used[a][b] = 0;
used[b][a] = c;
adj[a].push_back(b);
adj[b].push_back(a);
}
fclose(f);
}
//---------------------
int bfs()
{
bf[0] = 0;
vis[0] = 1;
int i,s,d,a,v;
memset(vis,0,n*sizeof(int));
nreach = 0;
for(s=0, d=1; s<d; s++)
{
a = bf[s];
for(i=0; i<adj[a].size(); i++)
{
v = adj[a][i];
if(vis[v] == 0 && used[a][v] < cost[a][v])
{
if(v == n-1)
reach[nreach++] = v;
vis[v] = 1;
par[v] = a;
bf[d++] = v;
}
}
}
return (nreach != 0);
}
//---------------------
void solve()
{
flux = 0;
while(bfs())
{
for(int i=0; i<nreach; i++)
{
int cflux = 1<<20;
for(int j=reach[i]; j != 0; j = par[j])
{
int fe = cost[par[j]][j] - used[par[j]][j];
if(fe < cflux)
cflux = fe;
}
for(int j=reach[i]; j != 0; j = par[j])
{
used[par[j]][j] += cflux;
used[j][par[j]] -= cflux;
}
flux += cflux;
}
}
FILE *f = fopen("maxflow.out","w");
fprintf(f,"%d",flux);
fclose(f);
}
//---------------------
int main()
{
read();
solve();
return 0;
}