Pagini recente » Cod sursa (job #2776647) | Cod sursa (job #2906470) | Cod sursa (job #1810734) | Cod sursa (job #1143146) | Cod sursa (job #899652)
Cod sursa(job #899652)
#include <cstdio>
#include <queue>
#define min(a,b) ( (a < b) ? a : b)
#define MAXN 1010
#define inf 1<<30
using namespace std;
struct graf
{
int nod;
graf *next;
};
graf *a[MAXN];
int c[MAXN][MAXN],f[MAXN][MAXN],viz[MAXN],tata[MAXN],flux,n,m;
void add(int x,int y)
{
graf *q=new graf;
q->nod=y;
q->next=a[x];
a[x]=q;
}
void read()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
int i;
for(i=1;i<=m;i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
c[x][y]=+z;
add(x,y);
add(y,x);
}
}
inline int bfs()
{
queue<int> coada;
for(int i=1;i<=n;i++)
viz[i]=0;
coada.push(1);
viz[1]=1;
while(!coada.empty())
{
int nod=coada.front();
coada.pop();
if(nod==n) continue;
graf *q=a[nod];
for(;q;q=q->next)
{
int vertex=q->nod;
if(c[nod][vertex]==f[nod][vertex] || viz[vertex]) continue;
viz[vertex]=1;
coada.push(vertex);
tata[vertex]=nod;
}
}
return viz[n];
}
void flow()
{
int flux_minim=0;
while(bfs())
{
graf *q=a[n];
for(;q;q=q->next)
{
int nod=q->nod;
if(c[nod][n]==f[nod][n] || !viz[nod]) continue;
tata[n]=nod;
flux_minim=inf;
for(nod=n;nod!=1;nod=tata[nod])
flux_minim=min(flux_minim,c[tata[nod]][nod]-f[tata[nod]][nod]);
if(flux_minim==0) continue;
for(nod=n;nod!=1;nod=tata[nod])
{
f[tata[nod]][nod]+=flux_minim;
f[nod][tata[nod]]-=flux_minim;
}
flux+=flux_minim;
}
}
printf("%d\n",flux);
}
int main()
{
read();
flow();
return 0;
}