Pagini recente » Cod sursa (job #1234259) | Cod sursa (job #3120879) | Cod sursa (job #1716355) | Cod sursa (job #3206750) | Cod sursa (job #767717)
Cod sursa(job #767717)
#include<cstdio>
#include<vector>
#define nmax 1001
#define oo 1000000000
using namespace std;
void read(),solve();
int bfs();
int n,m,minim,cap[nmax][nmax],flux[nmax][nmax],Q[nmax],viz[nmax],dad[nmax];
vector <int>V[nmax];
int main()
{
read();
solve();
return 0;
}
void read()
{
int i,x,y,c;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d", &n, &m);
for(i=1;i<=m;i++)
{
scanf("%d%d%d", &x, &y, &c);
V[x].push_back(y);
V[y].push_back(x);
cap[x][y]=c;
}
}
void solve()
{
int Flux,nod;
for(Flux=0;bfs();)
{
for(vector<int>::iterator it=V[n].begin();it!=V[n].end();it++)
{
if(it==V[n].end())break;
if(cap[*it][n]==flux[*it][n])continue;
if(!viz[*it])continue;
dad[n]=*it;
minim=oo;
for(nod=n;nod!=1;nod=dad[nod])
if(minim>(cap[dad[nod]][nod]-flux[dad[nod]][nod]))
minim=cap[dad[nod]][nod]-flux[dad[nod]][nod];
if(minim==0)continue;
for(nod=n;nod!=1;nod=dad[nod])
{
flux[dad[nod]][nod]+=minim;
flux[nod][dad[nod]]-=minim;
}
Flux+=minim;
}
}
printf("%d ", Flux);
}
int bfs()
{
int i,nod;
Q[0]=Q[1]=1;
for(i=1;i<=n;i++)
viz[i]=0;
viz[1]=1;
for(i=1;i<=Q[0];i++)
{
nod=Q[i];
if(nod==n)continue;
for(vector<int>::iterator it=V[nod].begin();it!=V[nod].end();it++)
{
//if(it==V[nod].end())break;
if(cap[nod][*it]==flux[nod][*it])continue;
if(viz[*it])continue;
viz[*it]=1;
Q[++Q[0]]=*it;
dad[*it]=nod;
}
}
return viz[n];
}