Pagini recente » Cod sursa (job #2707522) | Cod sursa (job #1363621) | Cod sursa (job #630937) | Cod sursa (job #1097624) | Cod sursa (job #2886890)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX=1005;
///ne vom folosi de notiunea de graf rezidual, adica graful retelei de transport
///in care pentru fiecare muchie introducem si muchia inversa, cu capacitate 0
///la fiecare pas trebuie sa gasim in acest graf un drum de la sursa
///la destinatie, in care fiecare muchie de pe drum sa aiba fluxul asociat pana
///in acest moment strict mai mic decat capacitatea sa
int N, M, cap[NMAX][NMAX], flow[NMAX][NMAX], P[NMAX];
vector<int> g[NMAX];
bool viz[NMAX];
queue<int> q;
bool BFS(){
while(!q.empty())
q.pop();
for(int i=1;i<=N;i++)
viz[i]=false;
q.push(1);
viz[1]=true;
int nod;
while(!q.empty()){
nod=q.front();
q.pop();
if(nod==N)
continue;
for(auto x: g[nod]){
if(flow[nod][x]==cap[nod][x] or viz[x]==true)
continue;
viz[x]=true;
q.push(x);
P[x]=nod;
}
}
return viz[N]==true;
}
int main()
{
fin>>N>>M;
int x, y, z;
for(int i=1;i<=M;i++){
fin>>x>>y>>z;
g[x].push_back(y);
g[y].push_back(x);
cap[x][y]=z;
}
int flow_total=0;
while(BFS()){
int fmin=INT_MAX;
for(int i=N;i!=1;i=P[i]){
fmin=min(fmin,cap[P[i]][i]-flow[P[i]][i]);
}
for(int i=N;i!=1;i=P[i]){
flow[P[i]][i]+=fmin;
flow[i][P[i]]-=fmin;
}
flow_total+=fmin;
}
fout<<flow_total;
fin.close();
fout.close();
return 0;
}