Pagini recente » Cod sursa (job #1995615) | Cod sursa (job #1982772) | Cod sursa (job #3005366) | Cod sursa (job #1286294) | Cod sursa (job #3268071)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int inf=1e9;
int flux_maxim(int S,int T,int nr_noduri,vector<vector<int>>&capacitate){
vector<vector<int>>flux(nr_noduri+1,vector<int>(nr_noduri+1));
vector<vector<int>>gr(nr_noduri+1);
vector<int>tata(nr_noduri+1,0);
queue<int>q;
for(int i=1;i<=nr_noduri;i++){
for(int j=1;j<=nr_noduri;j++){
if(capacitate[i][j]){
gr[i].push_back(j);
gr[j].push_back(i);
}
}
}
int val=0;
bool exista_flux=true;
while(exista_flux){
exista_flux=false;
for(int i=1;i<=nr_noduri;i++){
tata[i]=0;
}
tata[S]=S;
q.push(S);
while(!q.empty()){
int nod_curent=q.front();
q.pop();
if(nod_curent==T){
exista_flux=true;
continue;
}
for(auto&vecin:gr[nod_curent]){
if(!tata[vecin] && capacitate[nod_curent][vecin]-flux[nod_curent][vecin]>0){
tata[vecin]=nod_curent;
q.push(vecin);
}
}
}
for(auto& vecin:gr[T]){
if(!tata[vecin]){
continue;
}
tata[T]=vecin;
int nod_curent=T;
int minn=inf;
while(nod_curent!=S){
minn=min(minn,capacitate[tata[nod_curent]][nod_curent]-flux[tata[nod_curent]][nod_curent]);
nod_curent=tata[nod_curent];
}
nod_curent=T;
while(nod_curent!=S){
flux[tata[nod_curent]][nod_curent]+=minn;
flux[nod_curent][tata[nod_curent]]-=minn;
nod_curent=tata[nod_curent];
}
val+=minn;
}
}
return val;
}
int main(){
int n,m,nod1,nod2,cap;
cin>>n>>m;
int nr_noduri=n;
int S=1;
int T=nr_noduri;
vector<vector<int>>capacitate(nr_noduri+1,vector<int>(nr_noduri+1,0));
for(int i=1;i<=m;i++){
cin>>nod1>>nod2>>cap;
capacitate[nod1][nod2]=cap;
}
cout<<flux_maxim(S,T,nr_noduri,capacitate);
return 0;
}