Pagini recente » Cod sursa (job #1676204) | Cod sursa (job #1925060) | Cod sursa (job #1256777) | Cod sursa (job #711427) | Cod sursa (job #2668768)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int INF = (1<<29);
struct Muchie{
int a,b;
int capacitate;
int flux;
};
int n,m;
vector <Muchie> muchii;
vector <vector <int> > v;
vector <int> tata;
bool bfs(){
queue<int> q;
q.push(1);
tata.assign(n+1,-1);
tata[1]=m;
while(!q.empty()){
int node=q.front();
q.pop();
if(node==n) continue;
for(int i:v[node]){
Muchie edge=muchii[i];
if(tata[edge.b]!=-1 or edge.capacitate==edge.flux)
continue;
tata[edge.b]=i;
q.push(edge.b);
}
}
return tata[n]!=-1;
}
int main()
{
fin >> n >> m;
muchii.resize(2*m);
v.resize(n+1,vector<int>());
for(int i=0;i<2*m;i+=2){
fin >> muchii[i].a >> muchii[i].b >> muchii[i].capacitate;
muchii[i+1].a=muchii[i].b;
muchii[i+1].b=muchii[i].a;
v[muchii[i].a].push_back(i);
v[muchii[i+1].a].push_back(i+1);
}
int rasp=0;
while(bfs()){
for(int edge_from_dest_index : v[n]){
int edge_to_dest_index = edge_from_dest_index^1;
Muchie edge_to_dest = muchii[edge_to_dest_index];
if(tata[edge_to_dest.a]==-1 or edge_to_dest.flux == edge_to_dest.capacitate)
continue;
tata[n]=edge_to_dest_index;
int minim=INF;
for(int i=n;i!=1;i=muchii[tata[i]].a)
minim=min(minim,muchii[tata[i]].capacitate-muchii[tata[i]].flux);
if(minim==0) continue;
for(int i=n;i!=1;i=muchii[tata[i]].a){
muchii[tata[i]].flux+=minim;
muchii[tata[i]^1].flux-=minim;
}
rasp+=minim;
}
}
fout << rasp;
return 0;
}