Mai intai trebuie sa te autentifici.
Cod sursa(job #402562)
Utilizator | Data | 23 februarie 2010 22:41:45 | |
---|---|---|---|
Problema | Flux maxim | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.29 kb |
#include<stdio.h>
#include<vector>
#include<queue>
using namespace std;
#define DIM 1005
#define INF 1<<30
int C[DIM][DIM],F[DIM][DIM],T[DIM];
int START,END,n,m;
int Flow,nod,Min;
vector <int> g[DIM];
vector <int> ::iterator it;
vector <bool> ut(DIM);
queue <int> Q;
bool BF()
{
ut.clear(); ut.resize(n+1,0);
for(Q.push(START),ut[START]=1;!Q.empty();Q.pop())
{
int nod=Q.front();
if(nod==END)
continue;
for(it=g[nod].begin();it!=g[nod].end();it++)
{
if(C[nod][*it]<=F[nod][*it]||ut[*it])
continue;
ut[*it]=1;
T[*it]=nod;
Q.push(*it);
}
}
return ut[END];
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
START=1;END=n;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
g[x].push_back(y);
g[y].push_back(x);
C[x][y]=z;
}
while(BF())
{
for(it=g[END].begin();it!=g[END].end();it++)
{
if(C[*it][END]<=F[*it][END]||!ut[*it])
continue;
T[END]=*it; Min=INF;
for(nod=END;nod!=START;nod=T[nod])
Min=min(Min,C[T[nod]][nod]-F[T[nod]][nod]);
if(Min==0)
continue;
for(nod=END;nod!=START;nod=T[nod])
{
F[T[nod]][nod]+=Min;
F[nod][T[nod]]-=Min;
}
Flow+=Min;
}
}
printf("%d\n",Flow);
return 0;
}