Pagini recente » Cod sursa (job #997090) | Cod sursa (job #17459) | Cod sursa (job #1535958) | Cod sursa (job #1606705) | Cod sursa (job #316670)
Cod sursa(job #316670)
#include<stdio.h>
#define NMAX 1003
#define INF 1000000
struct lista {
int x;
lista *next;
};
lista *v[NMAX];
int n,m,flow,f[NMAX][NMAX],c[NMAX][NMAX],viz[NMAX],q[NMAX],t[NMAX];
void adauga(lista* &l,int x) {
lista *q=new lista;
q->x=x;
q->next=l;
l=q;
}
void citeste() {
int x,y,z,i;
freopen("maxflow.in","r",stdin);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) v[i]=NULL;
for(i=0;i<m;i++) {
scanf("%d%d%d",&x,&y,&z);
adauga(v[x],y);
adauga(v[y],x);
c[x][y]=z;
//c[y][x]=0;
//f[x][y]=f[y][x]=0;
}
fclose(stdin);
}
int BFS() {
int i,nod;
lista *l;
viz[1]=1;
for(i=2;i<=n;i++) viz[i]=0;
q[0]=1;
q[1]=1;
for(i=1;i<=q[0];i++) {
nod=q[i];
if(nod==n) continue;
for(l=v[nod];l;l=l->next) {
if(viz[l->x]||(f[nod][l->x]==c[nod][l->x])) continue;
viz[l->x]=1;
q[++q[0]]=l->x;
t[l->x]=nod;
}
}
return viz[n];
}
void scrie() {
freopen("maxflow.out","w",stdout);
printf("%d",flow);
fclose(stdout);
}
int main() {
lista *l;
int fmin,nod;
citeste();
for(flow=0;BFS();) {
for(l=v[n];l;l=l->next) {
if(f[l->x][n]==c[l->x][n]) continue;
t[n]=l->x;
fmin=INF;
for(nod=n;nod!=1;nod=t[nod])
if(c[t[nod]][nod]-f[t[nod]][nod]<fmin) fmin=c[t[nod]][nod]-f[t[nod]][nod];
flow+=fmin;
for(nod=n;nod!=1;nod=t[nod]) {
f[t[nod]][nod]+=fmin;
f[nod][t[nod]]-=fmin;
}
}
}
scrie();
return 0;
}