Pagini recente » Cod sursa (job #919397) | Cod sursa (job #473958) | Cod sursa (job #3162191) | Cod sursa (job #33698) | Cod sursa (job #1747358)
#include<fstream>
#include<stdlib.h>
#include<cstring>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n,m,cost[1001][1001],flux[1001][1001],v[1001],tata[1001],mflow;
struct nod{
int inf;
nod *urm;
}*L[1001];
void adaugsf(nod *&vf,int val){
nod *q;
q=new nod;
q->inf=val;
q->urm=vf;
vf=q;
}
int BFS(){
int i,coada[1001],p,u,x;
memset(v,0,sizeof(v));
nod *q;
p=u=1;
coada[p]=1;v[1]=1;
while(p<=u){
x=coada[p];
q=L[x];
while(q!=0){
if (v[q->inf]==0 && flux[x][q->inf]<cost[x][q->inf]){
v[q->inf]=1;tata[q->inf]=x;
if (q->inf!=n){
u++;
coada[u]=q->inf;
}
}
q=q->urm;
}
p++;
}
return v[n];
}
void Edmonds_Karp(){
int a,b,i,val;
nod *q;
while(BFS()==1){
q=L[n];
while(q!=0){
if (v[q->inf]==1 && flux[q->inf][n]<cost[q->inf][n]){
tata[n]=q->inf;
val=900000000;
i=n;
while(i!=1){
if (val>cost[tata[i]][i]-flux[tata[i]][i]) val=cost[tata[i]][i]-flux[tata[i]][i];
i=tata[i];
}
i=n;
while(i!=1){
flux[tata[i]][i]+=val;
flux[i][tata[i]]-=val;
i=tata[i];
}
mflow=mflow+val;
}
q=q->urm;
}
}
}
int main(){
fin>>n>>m;
int i,a,b;
for (i=1;i<=n;i++)
L[i]=0;
for (i=1;i<=m;i++){
fin>>a>>b;
fin>>cost[a][b];
adaugsf(L[a],b);
adaugsf(L[b],a);
}
fin.close();
Edmonds_Karp();
fout<<mflow;
fout.close();
return 0;
}