Pagini recente » Borderou de evaluare (job #1684967) | Borderou de evaluare (job #791808) | Borderou de evaluare (job #173659) | Borderou de evaluare (job #278506) | Cod sursa (job #241207)
Cod sursa(job #241207)
#include <algorithm>
#include <cstdio>
#include <string>
using namespace std;
#define n_max 1005
int mat[n_max][n_max];
struct nod { int x; nod *n;};
nod *a[n_max];
int n, m;
int t[n_max];
int latime()
{
int cd[n_max], p=0, q=0;
bool k[n_max];
int d[n_max];
memset(k, 0, sizeof(k));
memset(t, 0, sizeof(t));
memset(d, 0, sizeof(d));
k[1]=true;
cd[0]=1;
while(p<=q)
{
int u=cd[p++];
for(nod *i=a[u]; i; i=i->n)
if(!k[i->x])
if(mat[u][i->x] > 0)
{
cd[++q]=i->x;
k[i->x]=true;
t[i->x]=u;
d[i->x]=d[u] + 1;
}
}
if(t[n] == 0) return 0;
return 1;
}
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d\n", &n, &m);
for (int i=m; i>0; i--)
{
int p,q,c;
scanf("%d %d %d\n", &p, &q,&c);
nod *t=new nod;
t->x=q;
t->n=a[p];
a[p]=t;
t=new nod;
t->x=p;
t->n=a[q];
a[q]=t;
mat[p][q]=c;
}
int debit=0;
while(latime())
{
for(nod *i=a[n]; i; i=i->n)
if(t[i->x])
{
int minim=5000;
for(int j=i->x; t[j]; j=t[j])
minim=min(minim, mat[t[j]][j]);
minim=min(minim, mat[i->x][n]);
if(minim <= 0)
continue;
mat[i->x][n]-=minim;
mat[n][i->x]+=minim;
for(int j=i->x; t[j]; j=t[j])
{
mat[t[j]][j]-=minim;
mat[j][t[j]]+=minim;
}
debit+=minim;
}
}
printf("%d\n", debit);
return 0;
}