Pagini recente » Cod sursa (job #2838204) | Cod sursa (job #1905645) | Cod sursa (job #1095659) | Cod sursa (job #2427103) | Cod sursa (job #3145160)
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int n,m;
vector <int> v[1001]; ///muchiile
int c[1001][1001]; ///capacitatea fiecarei muchii
int f[1001][1001]; ///fluxul fiecarei muchii
int tt[1001]; ///arborele pentru drumuri
int ok[1001]; ///vectorul "vizitat"
queue <int> ord;
int flow,fmin;
void citire(){
cin>>n>>m;
int ii,jj,g;
for(int i=1;i<=m;i++){
cin>>ii>>jj>>g;
v[ii].push_back(jj);
v[jj].push_back(ii);
c[ii][jj]=g;
}
}
int bfs(int start){
for(int i=1;i<=n;i++)
ok[i]=0;
ok[start]=1;
ord.push(start);
while(!ord.empty()){
int elem1=ord.front();
for(unsigned int i=0;i<v[elem1].size();i++){
int elem2=v[elem1][i];
if(c[elem1][elem2] != f[elem1][elem2] && ok[elem2] == 0){
ok[elem2]=1;
ord.push(elem2);
tt[elem2]=elem1;
if(elem2==n){
while(!ord.empty())
ord.pop();
return 1;
}
}
}
ord.pop();
}
return 0;
}
void maxflow(){
for(flow=0; bfs(1); flow+=fmin){
fmin=1000000;
for(int i=n;i!=1;i=tt[i])
fmin=min(fmin, c[tt[i]][i] - f[tt[i]][i]);
for(int i=n;i!=1;i=tt[i]){
f[tt[i]][i]+=fmin;
f[i][tt[i]]-=fmin;
}
}
}
int main(){
citire();
maxflow();
cout<<flow;
}