Pagini recente » Cod sursa (job #585825) | Cod sursa (job #3156580) | Cod sursa (job #1566441) | Cod sursa (job #625539) | Cod sursa (job #370228)
Cod sursa(job #370228)
#include <fstream>
#include <vector>
#include <list>
#include <cstring>
using namespace std;
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
int N,M,flow,dad[1024],viz[1024],C[1024][1024],F[1024][1024];
vector<int> G[1024];
list<int> L;
int BFS(){
L.push_back(1);
memset(viz,0,sizeof(viz));
viz[1]=1;dad[1]=0;
while (!L.empty()){
list<int>::iterator it=L.begin();
for (unsigned int i=0;i<G[*it].size();++i) if (!viz[G[*it][i]] && C[*it][G[*it][i]]-F[*it][G[*it][i]]>0){
viz[G[*it][i]]=1;
L.push_back(G[*it][i]);
dad[G[*it][i]]=*it;
}
L.erase(it);
}
return viz[N];
}
int main(){
fi>>N>>M;
int x,y,z;
for (int i=1;i<=M;++i){
fi>>x>>y>>z;
C[x][y]=z;
G[x].push_back(y);G[y].push_back(z);
}
for (flow=0;BFS();)
for (int i=1;i<=N;++i) if (C[i][N]-F[i][N]>0){
int sat=C[i][N]-F[i][N];
for (int j=i;j!=1;j=dad[j]) sat=min(sat,C[dad[j]][j]-F[dad[j]][j]);
if (sat==0) continue;
F[i][N]+=sat;
F[N][i]-=sat;
for (int j=i;j!=1;j=dad[j]) { F[dad[j]][j]+=sat; F[j][dad[j]]-=sat; }
flow+=sat;
}
fo<<flow<<"\n";
fi.close();fo.close();
return 0;
}