Pagini recente » Cod sursa (job #62979) | Cod sursa (job #2755769) | Cod sursa (job #288098)
Cod sursa(job #288098)
Utilizator |
Pop Mircea contt |
Data |
25 martie 2009 15:57:03 |
Problema |
Flux maxim |
Scor |
50 |
Compilator |
cpp |
Status |
done |
Runda |
aa |
Marime |
1.09 kb |
#include <cstdio>
#include <queue>
#define dim 1100
using namespace std;
int n, m, c[dim][dim], f, precedent[dim];
queue<int> q;
bool bfs()
{
int nod, i, viz[dim];
while (!q.empty()) q.pop();
memset(viz, 0, sizeof(viz));
q.push(1);
viz[1]=1;
while (!q.empty())
{
nod=q.front();
q.pop();
if (nod==n) continue;
for (i=1; i<=n; i++)
if (c[nod][i] && !viz[i])
{
q.push(i);
precedent[i]=nod;
viz[i]=1;
}
}
return viz[n];
}
int main()
{
int i, x, y, z, fm, j;
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for (i=1; i<=m; i++)
{
scanf("%d %d %d\n", &x, &y, &z);
c[x][y]=z;
}
for (f=0; bfs();)
for (j=1; j<n; j++)
if (c[j][n])
{
precedent[n]=j;
fm=1<<30;
for (i=n; i!=1; i=precedent[i])
if (c[precedent[i]][i]<fm) fm=c[precedent[i]][i];
if (fm==0) continue;
for (i=n; i!=1; i=precedent[i])
{
c[precedent[i]][i]-=fm;
//c[i][precedent[i]]+=fm;
}
f+=fm;
}
printf("%d\n", f);
return 0;
}