Pagini recente » Cod sursa (job #3328610) | Monitorul de evaluare | Cod sursa (job #3322308) | Cod sursa (job #1808968) | Cod sursa (job #3328575)
#include <bits/stdc++.h>
std::vector<int> Ladj[NMAX+1];
const int NMAX = 1e3;
int L[NMAX+1][NMAX+1];
int flux[NMAX+1][NMAX+1];
int vis[NMAX+1];
int n,m;
int p[NMAX+1];
int bfs(int s, int dest){
for(int i = 1; i<=n ; i++)
{vis[i]=0;
p[i]=0;
}
std::queue<int> q;
q.push(s);
vis[s]=1;
while(!q.empty()){
int nod = q.front();
q.pop();
for(auto vecin : Ladj[nod]){
if(!vis[vecin] && L[nod][vecin] - flux[nod][vecin] > 0){
vis[vecin] = 1;
p[vecin] = nod;
q.push(vecin);
}
}
}
if(!vis[dest]){
return 0;
}
std::vector<int> path;
int x = dest;
while(x!=0){
path.push_back(x);
x=p[x];
}
std::reverse(path.begin(),path.end());
int flow = 1e9;
for(int i =0;i<path.size()-1;i++){
int a = path[i];
int b= path[i+1];
flow = std::min(flow,L[a][b]-flux[a][b]);
}
for(int i =0;i<path.size()-1;i++){
int a = path[i];
int b= path[i+1];
flux[a][b] += flow;
flux[b][a] -= flow;
}
return flow;
}
int main(){
std::ifstream fin("maxflow.in");
std::ofstream fout("maxflow.out");
fin>>n>>m;
for(int i=1; i<=m;i++){
int a,b,w;
fin >> a >> b >> w;
L[a][b]=w;
Ladj[a].push_back(b);
Ladj[b].push_back(a);
}
int maxflow = 0;
while(true) {
int flow = bfs(1, n);
if(flow == 0) {
break;
}
maxflow += flow;
}
fout<<maxflow;
fin.close();
fout.close();
}