Pagini recente » Cod sursa (job #627965) | Cod sursa (job #3124245) | Cod sursa (job #2928374) | Cod sursa (job #541423) | Cod sursa (job #1480855)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <utility>
#define NMAX 1001
#define oo 1000000
using namespace std;
vector< int >G[NMAX];
int C[NMAX][NMAX];
int n,m,S,D;
void ReadGraph()
{FILE *fin=fopen("maxflow.in","r");
fscanf(fin,"%d %d",&n,&m);
S=1,D=n;
for(int i=1;i<=m;++i)
{int x,y,c;
fscanf(fin,"%d%d%d",&x,&y,&c);
G[x].push_back(y);
G[y].push_back(x);
C[x][y]=c;
}
fclose(fin);
}
int Flow[NMAX][NMAX];
int Viz[NMAX];
queue<int>Q;
bool Edmuds_Krap()
{vector<int>::iterator it;
for(int i=1;i<=n;++i)Viz[i]=false;
Viz[S]=-1;
Q.push(S);
while(!Q.empty()&&!Viz[D])
{int x=Q.front();
for(it=G[x].begin();it!=G[x].end();++it)
if(!Viz[*it]&&C[x][*it]-Flow[x][*it]>0)
{Viz[*it]=x;
Q.push(*it);
}
Q.pop();
}
while(!Q.empty())Q.pop();
return Viz[D];
}
void Ford_Fulkenson()
{int Flux=0;
while(Edmuds_Krap())
{int mini=oo;
for(int i=D;i!=S;i=Viz[i])mini=min(mini,C[Viz[i]][i]-Flow[Viz[i]][i]);
for(int i=D;i!=S;i=Viz[i])
{Flow[Viz[i]][i]+=mini;
Flow[i][Viz[i]]=(-1)*Flow[Viz[i]][i];
}
Flux+=mini;
}
FILE *fout=fopen("maxflow.out","w");
fprintf(fout,"%d",Flux);
fclose(fout);
}
int main()
{ReadGraph();
Ford_Fulkenson();
return 0;
}